Respuestas:
Seguro y simple:
[]byte("Here is a string....")
[]byte("one", "two")
?
Para la conversión de una cadena a una rebanada 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)
Igual que el anterior, pero primero convierte explícitamente la cadena en un segmento:
copy(arr[:], []byte(str))
copy
función incorporada solo copia en un segmento, desde un segmento.[:]
hace que una matriz califique como un segmento.copy
solo copiará la parte de la cadena que se ajuste.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 hice disponible en Go Playground
b[i] = []byte("A")[0]
funciona, pero b[i] = 'A'
termina siendo mucho más limpio.
b[1] = '本'
Por ejemplo,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Salida:
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]
s
, `La función de copia no es tonta. Agregar y copiar segmentos : "El número de elementos copiados es el mínimo de len (src) y len (dst)".
Pedazo de pastel:
arr := []byte("That's all folks!!")
[]byte
Se prefiere el uso de rebanadas sobre las matrices [20]byte
. La respuesta es correcta según las mejores prácticas; si las especificaciones o el código requieren matrices, utilícelas copy
en su lugar (consulte los ejemplos en este hilo).
Yo pienso que es mejor..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Consulta aquí: http://play.golang.org/p/vpnAWHZZk7
Necesita una forma rápida de convertir una cadena [] a un tipo de byte. Para usar en situaciones como el almacenamiento de datos de texto en un archivo de acceso aleatorio u otro tipo de manipulación de datos que requiera que los datos de entrada estén en tipo [] byte.
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
que es útil cuando se usa ioutil.WriteFile, que acepta un segmento de bytes como parámetro de datos:
WriteFile func(filename string, data []byte, perm os.FileMode) error
Otro ejemplo
package main
import (
"fmt"
"strings"
)
func main() {
stringSlice := []string{"hello", "world"}
stringByte := strings.Join(stringSlice, " ")
// Byte array value
fmt.Println([]byte(stringByte))
// Corresponding string value
fmt.Println(string([]byte(stringByte)))
}
Salida:
[104 101 108 108 111 32 119 111 114 108 100] hola mundo
Por favor revise el enlace del patio de recreo
Terminé creando métodos específicos de matriz para hacer esto. Al igual que el paquete de codificación / binario con métodos específicos para cada tipo int. Por ejemplo binary.BigEndian.PutUint16([]byte, uint16)
.
func byte16PutString(s string) [16]byte {
var a [16]byte
if len(s) > 16 {
copy(a[:], s)
} else {
copy(a[16-len(s):], s)
}
return a
}
var b [16]byte
b = byte16PutString("abc")
fmt.Printf("%v\n", b)
Salida:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
Observe cómo quería relleno a la izquierda, no a la derecha.
byte16PutString
es una especie de reimplementación de la copy
función incorporada , que solo admite la creación de nuevas matrices en lugar de utilizar una existente. copy
tiene un soporte especial para el compilador, por lo que puede manejar diferentes tipos de argumentos, y probablemente tenga una implementación de alto rendimiento bajo las cubiertas. Además, la pregunta del OP se refería a escribir una cadena en una matriz existente, en lugar de asignar una nueva, aunque la mayoría de las otras respuestas parecen ignorar eso también ...
answer
Además de los métodos mencionados anteriormente, también puedes hacer un truco como
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Ir a jugar: http://play.golang.org/p/xASsiSpQmC
Nunca deberías usar esto :-)
[]byte
objeto adecuado utilizando su "conversión"; falla gravemente cuando intenta modificar p
, vea: play.golang.org/p/WHGl756ucj . En su caso, no estoy seguro de por qué preferiría doble inseguro sobre el b := []byte(s)
método.
cap()
tamaño arbitrario, lo que significa que está leyendo en memoria desconocida. Para que esto sea correcto, creo que debe asegurarse de asignar el reflect.SliceHeader
tamaño completo y configurarlo manualmente cap
. Algo como esto: play.golang.org/p/fBK4dZM-qD
Las matrices son valores ... las rebanadas son más como punteros. Eso [n]type
no es compatible, []type
ya que son fundamentalmente dos cosas diferentes. Puede obtener un segmento que apunte a una matriz mediante el uso arr[:]
que devuelve un segmento que tiene arr
como respaldo de almacenamiento.
Una forma de convertir un trozo de, por ejemplo, []byte
a [20]byte
es asignar en realidad una [20]byte
que se puede hacer mediante el uso var [20]byte
(ya que es un valor ... no make
es necesario) y luego copiar datos en él:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
Esencialmente, lo que muchas otras respuestas se equivocan es que []type
NO es una matriz.
[n]T
y []T
son cosas completamente diferentes!
Cuando se utiliza el reflejo, []T
no es de tipo Array sino de tipo Slice y [n]T
es de tipo Array.
Tampoco puedes usar map[[]byte]T
pero puedes usarmap[[n]byte]T
.
Esto a veces puede ser engorroso porque muchas funciones funcionan, por ejemplo, []byte
mientras que algunas funciones regresan [n]byte
(más notablemente las funciones hash en crypto/*
). Un hash sha256, por ejemplo, es [32]byte
y no es []byte
así cuando los principiantes intentan escribirlo en un archivo, por ejemplo:
sum := sha256.Sum256(data)
w.Write(sum)
obtendrán un error. La forma correcta de usar
w.Write(sum[:])
Sin embargo, ¿qué es lo que quieres? ¿Solo accediendo a la cadena bytewise? Puede convertir fácilmente un string
a []byte
usando:
bytes := []byte(str)
pero esto no es una matriz, es un segmento. Además byte
,! = rune
. En caso de que desee operar con "personajes", debe usar rune
... no byte
.
str
es mayor que la longitud dearr
, obtendrá un error de "índice fuera de rango".