2015-03-05 13 views
36

Dies scheint, wie es eine ziemlich gemeinsame Sache und reichlich Beispiele für den interwebs sein würde, aber ich kann nicht scheinen, ein Beispiel zu finden, wie ein [32]byte zu []byte konvertieren.Convert Array zu schneiden in Go

Ich habe eine Funktion, die von einer externen I lib aufrufen, die ein Array zurückgibt

func Foo() [32]byte {...} 

I dann das Ergebnis zu einer anderen Funktion zur Weiterverarbeitung übergeben müssen.

func Bar(b []byte) { ... } 

Unforunately, wenn ich

d := Foo() 
Bar(d) 

zu nennen versuchen bekomme ich

cannot convert d (type [32]byte) to type []byte 

Doing

[]byte(d) 

nicht viel besser ist. Wie mache ich das, vor allem, ohne eine Kopie der Daten zu erstellen (scheint dumm, diese Daten zu kopieren, wenn alles, was ich gerade mache, es weitergibt).

+4

See https://blog.golang.org/slices –

Antwort

51

Dies 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 eine Kopie des zugrunde liegenden Puffer nicht

+1

ist es möglich, einen oneliner wie 'Bar (Foo() [:])' arbeiten zu lassen? –

3

Diese den Trick tun erstellen:

slice := array[0:len(array)] 

auch die darunter liegende Puffer verhindert das Kopieren .

+4

Der Standardwert für die untere Grenze ist 0. Der Standardwert für die obere Grenze ist 'len (x)', so dass 'x [0: len (x)]' 'besser als' x [:] 'geschrieben wird. Welches ist genau das, was die bestehende Antwort sagt. –

+9

Ich finde die Anzahl der Downvotes ein wenig hart in Anbetracht der Gültigkeit der Lösung ... –

+0

Obwohl das OP nur eine vollständige Konvertierung des zugrunde liegenden Arrays wollte, ist es nützlich zu wissen, dass die Angabe der unteren und oberen Grenze identisch ist mit der Slice-Annotation. Zum Beispiel möchten Sie vielleicht ein Array zuweisen (anstatt make slice zu verwenden) und dann Teile des Arrays unter Verwendung der unteren/oberen Grenze festlegen. Beispiel: https://play.golang.org/p/BwIvavioBj –

21
arr[:] // arr is an array; arr[:] is the slice of all elements 
0

Sie können in der Regel schneiden eine Reihe von seinen Grenzen 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 produzieren, durch Schreiben:

my_array[START_SLICE:END_SLICE] 

Weglassen START_SLICE wenn es auf den niedrigen gleich gebunden und END_SLICE wenn die hohen Grenze entspricht, in Ihrem Fall:

a[0:32] 

Erzeugt die Scheibe des zugrunde liegenden Array und ist äquivalent zu:

a[0:] 
a[:32] 
a[:]