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