Antworten:
Sicher und einfach:
[]byte("Here is a string....")
[]byte
und kein festgelegtes Byte-Array [20]byte
zu verwenden ... Glauben Sie mir nicht? Schauen Sie sich Rob Pikes Antwort auf diesen Thread an
[]byte("one", "two")
?
Zum Konvertieren von einer Zeichenfolge in ein Byte-Slice string -> []byte
:
[]byte(str)
Zum Konvertieren eines Arrays in ein Slice [20]byte -> []byte
:
arr[:]
Zum Kopieren einer Zeichenfolge in ein Array string -> [20]byte
:
copy(arr[:], str)
Wie oben, jedoch wird die Zeichenfolge zuerst explizit in ein Slice konvertiert:
copy(arr[:], []byte(str))
copy
Funktion nur Kopien auf eine Scheibe, aus einem Stück.[:]
die Verwendung wird ein Array als Slice qualifiziert.copy
wird nur der Teil der Zeichenfolge kopiert, der passt.Dieser Code:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... gibt folgende Ausgabe:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Ich habe es auch auf dem Go Playground zur Verfügung gestellt
b[i] = []byte("A")[0]
funktioniert, aber b[i] = 'A'
am Ende viel sauberer ist.
b[1] = '本'
Zum Beispiel,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Ausgabe:
s: [97 98 99] a: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
s
, Die Kopierfunktion ist nicht dumm. Anhängen an und Kopieren von Slices : "Die Anzahl der kopierten Elemente ist das Minimum von len (src) und len (dst)."
Stück Kuchen:
arr := []byte("That's all folks!!")
[]byte
wird Arrays vorgezogen [20]byte
. Die Antwort ist korrekt, basierend auf Best Practices. Wenn Spezifikationen oder Code Arrays erfordern, verwenden Sie copy
stattdessen (siehe Beispiele an anderer Stelle in diesem Thread).
Ich denke es ist besser..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Überprüfen Sie hier: http://play.golang.org/p/vpnAWHZZk7
Sie benötigen eine schnelle Möglichkeit, eine [] Zeichenfolge in einen [] Bytetyp zu konvertieren. Zur Verwendung in Situationen wie dem Speichern von Textdaten in einer Direktzugriffsdatei oder einer anderen Art der Datenmanipulation, bei der die Eingabedaten vom Typ [] Byte sein müssen.
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
Dies ist nützlich, wenn ioutil.WriteFile verwendet wird, das einen Byte-Slice als Datenparameter akzeptiert:
WriteFile func(filename string, data []byte, perm os.FileMode) error
Ein anderes Beispiel
package main
import (
"fmt"
"strings"
)
func main() {
stringSlice := []string{"hello", "world"}
stringByte := strings.Join(stringSlice, " ")
// Byte array value
fmt.Println([]byte(stringByte))
// Corresponding string value
fmt.Println(string([]byte(stringByte)))
}
Ausgabe:
[104 101 108 108 111 32 119 111 114 108 100] Hallo Welt
Bitte überprüfen Sie den Link Spielplatz
Am Ende wurden Array-spezifische Methoden erstellt, um dies zu tun. Ähnlich wie das Codierungs- / Binärpaket mit spezifischen Methoden für jeden int-Typ. Zum Beispiel binary.BigEndian.PutUint16([]byte, uint16)
.
func byte16PutString(s string) [16]byte {
var a [16]byte
if len(s) > 16 {
copy(a[:], s)
} else {
copy(a[16-len(s):], s)
}
return a
}
var b [16]byte
b = byte16PutString("abc")
fmt.Printf("%v\n", b)
Ausgabe:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
Beachten Sie, wie ich links und nicht rechts auffüllen wollte.
byte16PutString
es sich um eine Art Neuimplementierung der integrierten copy
Funktion handelt, die nur das Erstellen neuer Arrays unterstützt, anstatt ein vorhandenes zu verwenden. copy
hat spezielle Compiler-Unterstützung, so dass es verschiedene Arten von Argumenten verarbeiten kann, und es hat wahrscheinlich eine wirklich leistungsstarke Implementierung unter dem Deckmantel. Außerdem wurde in der Frage des OP gefragt, ob ein String in ein vorhandenes Array geschrieben werden soll, anstatt einen neuen zuzuweisen, obwohl die meisten anderen Antworten dies ebenfalls zu ignorieren scheinen ...
answer
ist korrekt jeder Körper ist hier zu lernen und andere ermutigen,
Neben den oben genannten Methoden können Sie auch einen Trick ausführen
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Geh spielen: http://play.golang.org/p/xASsiSpQmC
Du solltest das niemals benutzen :-)
[]byte
mit Ihrer "Konvertierung" kein richtiges Objekt zu erhalten - es schlägt schlecht fehl, wenn Sie versuchen, Änderungen vorzunehmen p
, siehe: play.golang.org/p/WHGl756ucj . In Ihrem Fall nicht sicher, warum Sie doppelt unsichere gegenüber der b := []byte(s)
Methode bevorzugen würden .
cap()
beliebige Größe, was bedeutet, dass es in einen unbekannten Speicher liest. Damit dies richtig ist, müssen Sie meiner Meinung nach sicherstellen, dass Sie die volle reflect.SliceHeader
Größe zuweisen und die manuell einstellen cap
. So etwas wie das: play.golang.org/p/fBK4dZM-qD
Arrays sind Werte ... Slices ähneln eher Zeigern. Das ist [n]type
nicht kompatibel, []type
da es sich grundsätzlich um zwei verschiedene Dinge handelt. Sie können ein Slice erhalten, das auf ein Array verweist, indem Sie arr[:]
ein Slice zurückgeben, das arr
als Backup-Speicher dient.
Eine Möglichkeit, ein Slice von beispielsweise []byte
in zu konvertieren, besteht darin, ein Slice [20]byte
zuzuweisen, [20]byte
das Sie mithilfe von verwenden können var [20]byte
(da es sich um einen Wert handelt ... nicht make
erforderlich), und dann Daten darin zu kopieren:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
Was viele andere Antworten falsch machen, ist, dass []type
es sich NICHT um ein Array handelt.
[n]T
und []T
sind ganz andere Dinge!
Bei Verwendung von Reflect []T
handelt es sich nicht um ein Array, sondern um ein Slice und ein [n]T
Array.
Sie können auch nicht verwenden, map[[]byte]T
aber Sie können verwendenmap[[n]byte]T
.
Dies kann manchmal umständlich sein, da beispielsweise viele Funktionen ausgeführt werden, []byte
während einige Funktionen zurückkehren [n]byte
(insbesondere die Hash-Funktionen in crypto/*
). Ein sha256-Hash zum Beispiel ist [32]byte
und nicht []byte
, wenn Anfänger versuchen, ihn in eine Datei zu schreiben, zum Beispiel:
sum := sha256.Sum256(data)
w.Write(sum)
Sie erhalten einen Fehler. Die richtige Art zu verwenden ist
w.Write(sum[:])
Was möchten Sie jedoch? Nur byteweise auf die Zeichenfolge zugreifen? Sie können ganz einfach ein konvertieren string
zu []byte
verwenden:
bytes := []byte(str)
Aber dies ist kein Array, es ist ein Slice. Auch byte
! = rune
. Wenn Sie mit "Zeichen" arbeiten möchten, müssen Sie rune
... nicht verwenden byte
.
str
größer als die Länge vonarr
ist, wird der Fehler "Index außerhalb des Bereichs" angezeigt.