Passer au contenu principal
eLearner.app
Module 4 · Leçon 4 sur 519/50 dans le cours~12 min
Leçons du module (4/5)

Chaînes, octets et runes

En Go, un string est une séquence d'octets immuable. Littéraux de chaîne sont codés en UTF-8. Un rune est un alias pour int32 et représente un seul point de code Unicode.

Comprendre la différence entre les octets et les runes est essentiel pour éviter les bugs lorsqu'une chaîne contient des accents, des emojis, des idéogrammes ou tout autre caractère non-ASCII.

string = octets, pas caractères

Go
s := "ciaò"
fmt.Println(len(s))   // 5 — not 4!
fmt.Println(s[0])     // 99 ('c' as a byte)
fmt.Println(s[3])     // 195 (first byte of 'ò' in UTF-8)

len(s) renvoie le nombre d'octets, pas de caractères visibles. L'indexation de s[i] renvoie le i-ème octet (uint8), pas le caractère.

for range itère les runes

for i, r := range s décode UTF-8 à la volée : i est le décalage d'octet du début de la rune, r est la rune (int32) :

Go
s := "ciaò"
for i, r := range s {
    fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2)   <- starts at byte 3, takes 2 bytes

[]rune(s) : indexation par caractère

Conversion explicite : alloue une nouvelle tranche de runes. Cher mais parfois nécessaire :

Go
runes := []rune("ciaò")
fmt.Println(len(runes))    // 4
fmt.Println(string(runes[3])) // ò

string(runes) est la conversion inverse : prend un []rune et produit une chaîne UTF-8.

Les chaînes sont immuables

Go
s := "ciao"
// s[0] = 'C'   // ERROR: cannot assign to s[0]

Pour muter, convertir en []byte ou []rune, opérer, reconvertir :

Go
b := []byte(s)
b[0] = 'C'
s = string(b)   // "Ciao"

Concaténation

L'opérateur + fonctionne, mais pour de nombreuses concaténations dans une boucle, utilisez strings.Builder (plus efficace, évite les allocations intermédiaires) :

Go
var sb strings.Builder
for i := 0; i < 5; i++ {
    sb.WriteString("ab")
}
fmt.Println(sb.String())   // "ababababab"

Forfaits utiles

  • strings : Contains, HasPrefix, Split, Join, ToUpper, Replace...
  • strconv : Atoi, Itoa, Contains0, Contains1...
  • Contains2 : Contains3, Contains4, Contains5...
  • Contains6 : Contains7 (alternative au Contains8).

Essayez-le

Exercice#go.m4.l4.e1
Tentatives : 0Chargement…

Itérez la chaîne s avec la plage et imprimez l'index et la rune en utilisant %d %c.

Chargement de l'éditeur…
Afficher l'indice

la plage sur une chaîne renvoie un décalage d'octets + une rune.

Solution disponible après 3 tentatives

Exercice#go.m4.l4.e2
Tentatives : 0Chargement…

Convertissez s en []rune et imprimez sa longueur en caractères.

Chargement de l'éditeur…
Afficher l'indice

Conversion explicite : `[]rune(s)`.

Solution disponible après 3 tentatives

Quiz#go.m4.l4.e3
Prêt

Qu'est-ce que len("ciaò") ?

Go
s := "ciaò"
fmt.Println(len(s))
Options de réponse

Récapitulatif

  • string = séquence d'octets immuable, codée en UTF-8.
  • len(s) = octets ; s[i] = le i-ème octet (uint8).
  • for i, r := range s décode les runes ; i est le décalage d'octet.
  • []rune(s) pour indexer par caractère (coûteux, alloue).
  • Pour muter : passer par []byte ou []rune.
  • Pour concaténer en boucle : strings.Builder.
  • Packages clés : strings, len(s)0, len(s)1, len(s)2.