Risposte:
Sicuro e semplice:
[]byte("Here is a string....")
[]byte
e non una serie di byte [20]byte
quando si converte una stringa in byte ... Non mi credi?
[]byte("one", "two")
.
Per la conversione da una stringa a una fetta di byte, string -> []byte
:
[]byte(str)
Per convertire un array in una sezione [20]byte -> []byte
:
arr[:]
Per la copia di una stringa in un array, string -> [20]byte
:
copy(arr[:], str)
Come sopra, ma prima converti esplicitamente la stringa in una sezione:
copy(arr[:], []byte(str))
copy
funzione integrata copia solo in una sezione, da una sezione.[:]
rende un array idoneo come slice.copy
copierà solo la parte della stringa adatta.Questo codice:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... fornisce il seguente output:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
L'ho anche reso disponibile al Go Playground
b[i] = []byte("A")[0]
funziona, ma b[i] = 'A'
finisce per essere molto più pulito.
b[1] = '本'
Per esempio,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Produzione:
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 funzione `copia non è stupida. Aggiunta e copia di sezioni : "Il numero di elementi copiati è il minimo di len (src) e len (dst)."
Pezzo di torta:
arr := []byte("That's all folks!!")
[]byte
è preferito rispetto alle matrici [20]byte
. La risposta è corretta in base alle migliori pratiche; se le specifiche o il codice richiedono matrici, utilizzare copy
invece (vedere esempi altrove in questo thread).
Penso che sia meglio ..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Controlla qui: http://play.golang.org/p/vpnAWHZZk7
È necessario un modo rapido per convertire una stringa [] nel tipo di byte []. Da utilizzare in situazioni come l'archiviazione di dati di testo in un file ad accesso casuale o un altro tipo di manipolazione dei dati che richiede che i dati di input siano nel tipo di byte [].
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
che è utile quando si utilizza ioutil.WriteFile, che accetta una porzione di byte come parametro di dati:
WriteFile func(filename string, data []byte, perm os.FileMode) error
Un altro esempio
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)))
}
Produzione:
[104 101 108 108 111 32 119 111 114 108 100] ciao mondo
Si prega di controllare il parco giochi di collegamento
Ho finito per creare metodi specifici dell'array per fare questo. Proprio come il pacchetto di codifica / binario con metodi specifici per ogni tipo di int. Per esempio 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)
Produzione:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
Notate come volevo imbottitura a sinistra, non a destra.
byte16PutString
è una sorta di reimplementazione della copy
funzione built-in , che supporta solo la creazione di nuove matrici invece di usarne una esistente. copy
ha un supporto compilatore speciale, quindi può gestire diversi tipi di argomenti e probabilmente ha un'implementazione ad alte prestazioni sotto le coperte. Inoltre, la domanda del PO ha posto la domanda di scrivere una stringa su un array esistente, piuttosto che assegnarne uno nuovo, anche se la maggior parte delle altre risposte sembra ignorare anche questo ...
answer
Oltre ai metodi sopra menzionati, puoi anche fare un trucco come
s := "hello"
b := *(*[]byte)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s))))
Vai a giocare: http://play.golang.org/p/xASsiSpQmC
Non dovresti mai usare questo :-)
[]byte
oggetto corretto usando la "conversione" - fallisce male quando si tenta di modificare p
, vedere: play.golang.org/p/WHGl756ucj . Nel tuo caso, non sono sicuro del motivo per cui preferiresti doppio non sicuro rispetto al b := []byte(s)
metodo.
cap()
dimensione arbitraria, il che significa che sta leggendo nella memoria sconosciuta. Perché questo sia corretto, penso che dovresti assicurarti di allocare le reflect.SliceHeader
dimensioni complete e impostare manualmente il cap
. Qualcosa del genere: play.golang.org/p/fBK4dZM-qD
Le matrici sono valori ... le sezioni sono più simili a puntatori. Ciò [n]type
non è compatibile []type
in quanto fondamentalmente sono due cose diverse. È possibile ottenere una sezione che punta a un array utilizzando arr[:]
quale restituisce una sezione che haarr
come supporto di archiviazione.
Un modo per convertire una fetta di per esempio []byte
per [20]byte
è quello di allocare in realtà una [20]byte
che si può fare utilizzando var [20]byte
(come è un valore ... non make
necessario) e poi copiare i dati in esso:
buf := make([]byte, 10)
var arr [10]byte
copy(arr[:], buf)
In sostanza, molte altre risposte sbagliate []type
non sono un array.
[n]T
e []T
sono cose completamente diverse!
Quando si utilizza reflect []T
non è di tipo Array ma di tipo Slice e[n]T
è di tipo Array.
Inoltre non puoi usare map[[]byte]T
ma puoi usaremap[[n]byte]T
.
Questo a volte può essere ingombrante perché molte funzioni operano ad esempio []byte
mentre alcune funzioni ritornano [n]byte
(in particolare le funzioni hash in crypto/*
). Un hash sha256 per esempio è [32]byte
e non è []byte
così quando i principianti provano a scriverlo in un file per esempio:
sum := sha256.Sum256(data)
w.Write(sum)
riceveranno un errore. Il modo corretto di è usare
w.Write(sum[:])
Tuttavia, che cosa vuoi? Stai solo accedendo alla stringa in senso byte? Puoi facilmente convertire un string
in []byte
usando:
bytes := []byte(str)
ma questo non è un array, è una fetta. Inoltre byte
,! = rune
. Nel caso tu voglia operare su "personaggi" devi usare rune
... no byte
.
str
è maggiore della lunghezza diarr
allora si otterrà un errore "indice fuori intervallo".