Dies scheint , wie es eine ziemlich gemeinsame Sache und reichlich Beispiele für die interwebs sein würde, aber ich kann nicht ein Beispiel zu finden scheinen , wie ein konvertieren [32]byte
zu []byte
.
Ich habe eine Funktion, die ich von einer externen Bibliothek aufrufe, die ein Array zurückgibt
func Foo() [32]byte {...}
Ich muss dieses Ergebnis dann zur weiteren Verarbeitung an eine andere Funktion übergeben.
func Bar(b []byte) { ... }
Leider, wenn ich versuche anzurufen
d := Foo()
Bar(d)
Ich bekomme
cannot convert d (type [32]byte) to type []byte
Tun
[]byte(d)
ist nicht viel besser. Wie mache ich das, insbesondere ohne eine Kopie der Daten zu erstellen (es scheint albern, diese Daten zu kopieren, wenn ich sie nur weitergebe).
Antworten:
Das sollte funktionieren:
func Foo() [32]byte { return [32]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} } func Bar(b []byte) { fmt.Println(string(b)) } func main() { x := Foo() Bar(x[:]) }
Und es wird keine Kopie des zugrunde liegenden Puffers erstellt
quelle
Bar(Foo()[:])
Arbeiten zu bringen?arr[:] // arr is an array; arr[:] is the slice of all elements
quelle
Dies wird den Trick machen:
slice := array[0:len(array)]
Vermeidet auch das Kopieren des zugrunde liegenden Puffers.
quelle
len(x)
alsox[0:len(x)]
besser geschrieben alsx[:]
. Welches ist genau das, was die vorhandene Antwort sagt.Sie können ein Array im Allgemeinen nach seinen Grenzen aufteilen mit
:
:var a [32]byte slice := a[:]
Allgemeiner für das folgende Array:
var my_array [LENGTH]TYPE
Sie können die Scheibe in verschiedenen Größen herstellen, indem Sie Folgendes schreiben:
Auslassen,
START_SLICE
wenn es der Untergrenze entspricht undEND_SLICE
wenn es der Obergrenze entspricht , in Ihrem Fall:a[0:32]
Erzeugt das Slice des zugrunde liegenden Arrays und entspricht:
a[0:] a[:32] a[:]
quelle