Junior
Comment fonctionnent les chaînes dans le langage Go?
sobes.tech IA
Réponse de l'IA
Les chaînes en Go sont des séquences immuables d'octets. Elles représentent une "tranche d'octets" ([]byte) avec une garantie d'immuabilité.
Caractéristiques clés :
- Immuabilité : Après la création, une chaîne ne peut pas être modifiée. Toute opération semblant la modifier crée en réalité une nouvelle chaîne.
- Représentation : Par défaut, les chaînes en Go représentent du texte encodé en UTF-8. Cependant, ce ne sont que des séquences d'octets ; l'interprétation en tant que UTF-8 se fait lors du traitement avec des runes.
- Runes : Les caractères Unicode en Go sont représentés par le type
rune, qui est un alias pourint32. L'itération sur une chaîne avecrangedécode automatiquement UTF-8 et fournit les runes et leurs indices initiaux en octets. - Longueur : La fonction
len(s)retourne le nombre de octets dans la chaîne, pas le nombre de caractères (runes). Pour le nombre de runes, utilisezutf8.RuneCountInString(s)ou itérez avecrange. - Concaténation : Pour joindre des chaînes, utilisez l'opérateur
+. Cela crée une nouvelle chaîne. Pour une concaténation efficace de nombreuses chaînes, utilisezstrings.Builder.
Exemples :
// Déclaration d'une chaîne
str := "Hello, 世界"
// Longueur de la chaîne (en octets)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1) (1) 世(3) 界(3))
// Itération sur les runes
runeCount := 0
for index, runeValue := range str {
// index - index initial de la rune en octets
// runeValue - la rune
runeCount++
// fmt.Printf("Index : %d, Rune : %c (Valeur : %d)\n", index, runeValue, runeValue)
}
// runeCount - nombre de runes (9)
// Accès à un octet par index
// Attention : c'est un octet, pas un caractère !
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Octet initial du caractère '世'
// Concaténation de chaînes
newStr := str + "!"
// Utilisation de strings.Builder pour une concaténation efficace
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"