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
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) :
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 :
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
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]Pour muter, convertir en []byte ou []rune, opérer, reconvertir :
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) :
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 auContains8).
Essayez-le
Itérez la chaîne s avec la plage et imprimez l'index et la rune en utilisant %d %c.
Afficher l'indice
la plage sur une chaîne renvoie un décalage d'octets + une rune.
Solution disponible après 3 tentatives
Convertissez s en []rune et imprimez sa longueur en caractères.
Afficher l'indice
Conversion explicite : `[]rune(s)`.
Solution disponible après 3 tentatives
Qu'est-ce que len("ciaò") ?
s := "ciaò"
fmt.Println(len(s))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 sdécode les runes ;iest le décalage d'octet.[]rune(s)pour indexer par caractère (coûteux, alloue).- Pour muter : passer par
[]byteou[]rune. - Pour concaténer en boucle :
strings.Builder. - Packages clés :
strings,len(s)0,len(s)1,len(s)2.