Je veux affecter une chaîne à un tableau d'octets:
var arr [20]byte
str := "abc"
for k, v := range []byte(str) {
arr[k] = byte(v)
}
Avoir une autre méthode?
Sûr et simple:
[]byte("Here is a string....")
Pour convertir une chaîne en une tranche d'octet, string -> []byte
:
[]byte(str)
Pour convertir un tableau en une tranche, [20]byte -> []byte
:
arr[:]
Pour copier une chaîne dans un tableau, string -> [20]byte
:
copy(arr[:], str)
Comme ci-dessus, mais en convertissant explicitement la chaîne en une tranche:
copy(arr[:], []byte(str))
copy
ne copie que dans une tranche, à partir de une tranche.[:]
, un tableau est qualifié de tranche.copy
ne copiera que la partie de la chaîne qui convient.Ce code:
var arr [20]byte
copy(arr[:], "abc")
fmt.Printf("array: %v (%T)\n", arr, arr)
... donne la sortie suivante:
array: [97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] ([20]uint8)
Je l'ai également rendu disponible au Go Playground
Par exemple,
package main
import "fmt"
func main() {
s := "abc"
var a [20]byte
copy(a[:], s)
fmt.Println("s:", []byte(s), "a:", a)
}
Sortie:
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]
Part de gâteau:
arr := []byte("That's all folks!!")
Je pense que c'est mieux..
package main
import "fmt"
func main() {
str := "abc"
mySlice := []byte(str)
fmt.Printf("%v -> '%s'",mySlice,mySlice )
}
Vérifiez ici: http://play.golang.org/p/vpnAWHZZk7
Vous avez besoin d'un moyen rapide de convertir une chaîne [] en type [] octet. À utiliser dans des situations telles que le stockage de données texte dans un fichier à accès aléatoire ou tout autre type de manipulation de données nécessitant que les données d'entrée soient de type [] octets.
package main
func main() {
var s string
//...
b := []byte(s)
//...
}
ce qui est utile lors de l'utilisation de ioutil.WriteFile, qui accepte une tranche d'octets comme paramètre de données:
WriteFile func(filename string, data []byte, perm os.FileMode) error
Un autre exemple
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)))
}
Sortie:
[104 101 108 108 111 32 119 111 114 108 100] bonjour le monde
S'il vous plaît vérifier le lien terrain de je
Nous avons fini par créer des méthodes spécifiques au tableau pour ce faire. Tout comme le package encoding/binary avec des méthodes spécifiques pour chaque type int. Par exemple, 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)
Sortie:
[0 0 0 0 0 0 0 0 0 0 0 0 0 97 98 99]
Remarquez comme je voulais un rembourrage à gauche et non à droite.