Cómo asignar una cadena a una matriz de bytes
Quiero asignar una cadena a una matriz de bytes:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
¿Tienes otro método?
Aceptado
Seguro y sencillo:
[]byte("Here is a string....")
Para convertir de una cadena a un segmento de bytes string -> []byte
,:
[]byte(str)
Para convertir una matriz en un segmento [20]byte -> []byte
,:
arr[:]
Para copiar una cadena a una matriz string -> [20]byte
,:
copy(arr[:], str)
Lo mismo que arriba, pero primero convierte explícitamente la cadena en un segmento:
copy(arr[:], []byte(str))
- La función incorporada
copy
solo copia a un sector, desde un sector. - Las matrices son "los datos subyacentes", mientras que los sectores son "una ventana gráfica de los datos subyacentes".
- El uso
[:]
hace que una matriz califique como una porción. - Una cadena no califica como un segmento en el que se puede copiar , pero sí se considera un segmento del que se puede copiar (las cadenas son inmutables).
- Si la cadena es demasiado larga,
copy
solo se copiará la parte de la cadena que encaje (y las runas multibyte se pueden copiar solo parcialmente, lo que corromperá la última runa de la cadena resultante).
Este código:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
...da el siguiente resultado:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
También lo puse a disposición en Go Playground.
Por ejemplo,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Producción:
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]
Pedazo de pastel:
arr := []byte("That's all folks!!")