Sobes.tech
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 pour int32. L'itération sur une chaîne avec range dé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, utilisez utf8.RuneCountInString(s) ou itérez avec range.
  • 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, utilisez strings.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"