Maison > développement back-end > Golang > Pourquoi devriez-vous utiliser des tranches de runes au lieu de chaînes lorsque vous travaillez avec des caractères multi-octets dans Go ?

Pourquoi devriez-vous utiliser des tranches de runes au lieu de chaînes lorsque vous travaillez avec des caractères multi-octets dans Go ?

Barbara Streisand
Libérer: 2024-11-02 14:03:02
original
665 Les gens l'ont consulté

Why Should You Use Rune Slices Instead of Strings When Working with Multibyte Characters in Go?

Comprendre la différence entre le range over string et le rune slice

Lorsque vous travaillez avec des chaînes dans Go, vous pouvez rencontrer deux scénarios courants : le range over une chaîne et s'étendant sur une tranche de rune. Bien que les deux approches puissent sembler similaires pour récupérer des caractères, il existe une différence subtile qui peut avoir un impact sur le comportement du programme.

Ranging Over a String

Considérez le code suivant :

<code class="go">func main() {
    str := "123456"
    for _, s := range str {
        fmt.Printf("type of v: %s, value: %v, string v: %s \n", reflect.TypeOf(s), s, string(s))
    }
}</code>
Copier après la connexion

Ce code parcourt chaque caractère de la chaîne, mais notez que le type de données de s est un int32 et que la ou les chaînes sont utilisées pour coder la rune sous forme de chaîne.

Ranging Over a Rune Slice

Maintenant, examinons une variante dans laquelle nous convertissons la chaîne en une tranche de rune en utilisant []rune(str):

<code class="go">func main() {
    str := "123456"
    for _, s := range []rune(str) {
        fmt.Printf("type : %s, value: %v ,string : %s\n", reflect.TypeOf(s), s, string(s))
    }
}</code>
Copier après la connexion

Ici, s est une rune, et les chaînes fournissent toujours la même représentation sous forme de chaîne.

La distinction subtile

Bien que les résultats dans les deux scénarios puissent sembler identiques à première vue, il y a une différence cruciale :

  • Lorsqu'il s'étend sur une chaîne, l'index (_) représente les indices d'octets, et s stocke le code unicode point.
  • Lorsqu'il s'étend sur une tranche de rune, l'index représente également des indices d'octets, mais s stocke la rune elle-même.

Cette distinction subtile devient évidente lorsque l'on travaille avec des caractères multi-octets (caractères non latins comme le chinois ou le coréen), car leurs représentations UTF-8 sont constituées de plusieurs octets.

Implications pratiques

Lorsqu'il s'agit de caractères multi-octets, l'utilisation d'une tranche de rune au lieu d'une chaîne est plus appropriée. En effet, une rune représente un seul caractère logique, alors qu'une chaîne peut contenir plusieurs octets représentant ce même caractère.

Pour éviter des problèmes potentiels, il est généralement recommandé de préférer les boucles de plage aux tranches de rune plutôt qu'aux chaînes, en particulier lorsque traitant de caractères non latins.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal