Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-11-02 14:03:02564parcourir

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>

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>

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!

Déclaration:
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