Ces dernières années, à mesure que le langage Go devient progressivement populaire, de plus en plus de personnes choisissent d'utiliser le langage Go pour développer des projets. Cependant, lors du processus de développement du langage Go, nous rencontrons parfois des problèmes inexplicables. L'un des problèmes les plus courants est le problème des octets tronqués. Ensuite, nous présenterons en détail le problème des octets tronqués et proposerons quelques solutions.
Tout d’abord, nous devons savoir ce qu’est l’octet. Dans le langage Go, byte est un type de nombre naturel, représentant une valeur d'octet de 8 bits (entiers non signés de 8 bits), qui peut être utilisée pour représenter des caractères ASCII. Rune est un entier représentant un caractère Unicode, qui peut être utilisé pour représenter des caractères ASCII et d'autres caractères multi-octets. Habituellement, nous utilisons une chaîne pour stocker les caractères, et des tranches d'octets ([]byte) sont utilisées pour stocker la séquence d'octets des chaînes de code ASCII, c'est-à-dire qu'un caractère correspond à un octet.
Lorsque nous convertissons des caractères en tranches d'octets (c'est-à-dire que nous convertissons des chaînes en []octet), des caractères tronqués apparaissent parfois. Par exemple, le code suivant :
func main() { str := "你好,世界!" b := []byte(str) fmt.Println(b) }
Le résultat de sortie est :
[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
Comme vous pouvez le voir, le programme n'affiche pas le "Bonjour tout le monde" auquel nous nous attendions, mais un tas de caractères tronqués. Alors, pourquoi est-ce ?
En fait, cela est dû au fait que la couche inférieure de la chaîne dans le langage Go est un tableau d'octets. Lors de la conversion d'une chaîne en tranche d'octets, les caractères de la chaîne seront convertis en type d'octets un par un. Dans l'encodage UTF-8, les caractères chinois font 3 octets, tandis qu'une lettre anglaise ne fait que 1 octet. Par conséquent, lorsque nous convertissons des caractères chinois en octets, nous devons occuper 3 octets, mais lors de la conversion d'une chaîne en [] octet, chaque caractère n'occupe qu'un octet, donc le problème des caractères tronqués se produit.
Par exemple, les deux caractères "Bonjour" correspondent au codage hexadécimal E4BDA0 E5A5BD en codage UTF-8. Le résultat de sa conversion en type octet est :
[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
Si vous épissez directement deux octets. Levez-vous et obtenez :
[]byte{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}
Cela entraînera des problèmes de code tronqué. Par conséquent, lors de la conversion d'une chaîne en tranche d'octets, nous devons utiliser les fonctions appropriées dans le package de chaînes pour la conversion, telles que strconv.Atoi(), strconv.ParseInt(), strconv.ParseUint(), strconv.ParseFloat() , strconv. Quote() et ainsi de suite.
Bien sûr, dans certains cas particuliers, nous pouvons également convertir manuellement une chaîne en type octet au lieu d'utiliser les fonctions du package string. La méthode de fonctionnement spécifique est la suivante :
func main() { str := "你好,世界!" b := make([]byte, len(str)*3) blen := 0 for _, runeValue := range str { c := utf8.EncodeRune(b[blen:], runeValue) blen += c } fmt.Println(b[:blen]) }
Le résultat de sortie est :
[228 189 160 229 165 189 239 188 129 231 149 140 239 188 154 33]
On peut voir que le résultat de notre conversion manuelle est cohérent avec le résultat obtenu en utilisant la fonction dans le package de chaînes.
En plus des méthodes ci-dessus, nous pouvons également utiliser des bibliothèques tierces pour aider à résoudre le problème des octets tronqués, telles que GORM, goka, gRPC, etc.
En bref, lorsque nous utilisons le langage Go pour développer des projets, nous devons faire attention au problème des caractères tronqués et utiliser autant que possible les fonctions du package de chaînes pour la conversion, ou utiliser des bibliothèques tierces. Ce n'est qu'en résolvant correctement ce problème que nous pourrons mieux utiliser le langage Go pour les travaux de développement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!