go

Convierta la matriz para cortar en Go



(4)

En general, puede dividir una matriz por sus límites con:

var a [32]byte slice := a[:]

Más generalmente, para la siguiente matriz:

var my_array [LENGTH]TYPE

Puede producir la porción de diferentes tamaños escribiendo:

my_array[START_SLICE:END_SLICE]

Omitiendo START_SLICE si es igual al límite inferior y END_SLICE si es igual al límite superior, en su caso:

a[0:32]

Produce el segmento de la matriz subyacente y es equivalente a:

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

Parece que sería algo bastante común y abundantes ejemplos en todas las redes, pero parece que no puedo encontrar un ejemplo de cómo convertir un [32]byte a []byte .

Tengo una función que llamo desde una biblioteca externa que devuelve una matriz

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

Luego necesito pasar ese resultado a una función diferente para su posterior procesamiento.

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

Desafortunadamente, si trato de llamar

d := Foo() Bar(d)

yo obtengo

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

Haciendo

[]byte(d)

no es mucho mejor Cómo hago esto, especialmente sin crear una copia de los datos (parece una tontería copiar estos datos cuando todo lo que hago es pasarlos).


Esto debería funcionar:

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[:]) }

Y no crea una copia del búfer subyacente


Esto hará el truco:

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

También evita copiar el búfer subyacente.


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