Sobes.tech
Middle

Quelles sont les nuances lors de l'itération sur une chaîne en Go?

sobes.tech IA

Réponse de l'IA

Lors de l’itération sur une chaîne en Go, il est important de garder à l’esprit que la chaîne représente une séquence d’octets, et non de caractères Unicode. Le paquet unicode/utf8 fournit des fonctions pour travailler avec des séquences UTF-8 multibyte.

Points clés :

  • Itération par octets : La boucle for i := 0; i < len(s); i++ itère sur des octets individuels. Si la chaîne contient des caractères multibyte, un caractère peut être représenté par plusieurs octets.

    // Exemple d’itération par octets
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // affiche les octets, pas les caractères
    }
    
  • Itération par runes (points de code Unicode) : Pour travailler correctement avec les caractères Unicode, utilisez la boucle for index, ru := range s. Elle itère sur les runes (points de code Unicode), gérant les séquences UTF-8 multibyte.

    // Exemple d’itération par runes
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // affiche l’indice de début de la rune et la rune elle-même (en int32)
    }
    
  • Longueur de la chaîne : La fonction len(s) retourne le nombre d’octets, pas de runes. Pour obtenir le nombre de runes, utilisez utf8.RuneCountInString(s).

    // Exemple de comptage d’octets et de runes
    str := "Привет"
    println("Longueur en octets :", len(str)) // affiche le nombre d’octets
    println("Longueur en runes :", utf8.RuneCountInString(str)) // affiche le nombre de runes
    
  • Accès par index : L’accès via s[i] retourne le i-ème octet, pas la rune. L’accès direct aux runes par index n’est pas prévu.

    // Exemple d’accès à un octet
    str := "Привет"
    println(str[0]) // affiche le premier octet de la chaîne, pas la première rune
    
  • Tranches de chaînes : Les tranches de chaînes fonctionnent également au niveau des octets. s[i:j] crée une nouvelle tranche d’octets.

    // Exemple de tranche de chaîne par octets
    str := "Привет"
    println(str[0:2]) // peut afficher une séquence incorrecte si les deux premiers octets ne forment pas une rune complète
    

Pour travailler de manière fiable avec Unicode en Go, il est recommandé d’utiliser l’itération par runes (range) et les fonctions du paquet unicode/utf8.