Qu'est-ce qu'une rune en Go et en quoi diffère-t-elle d'un octet ordinaire ?
Je viens de commencer à apprendre Go et je suis tombé sur une chose étrange — le type `rune`. Apparemment c'est un entier, mais alors pourquoi un type séparé ? J'essaie de travailler avec des strings et j'ai remarqué que lorsque je prends un caractère par index, j'obtiens des nombres étranges, pas des lettres.
Voici un exemple qui m'a dérouté :
```go
package main
import "fmt"
func main() {
s := "Привет, мир!"
fmt.Println(s[0]) // Affiche 208, pas 'П'
fmt.Println(string(s[0])) // Affiche 'Ð', pas 'П'
}
```
Pourquoi cela se produit-il ? Je m'attendais à ce que `s[0]` me donne le premier caractère de la string. Mais au lieu de cela, j'obtiens quelque chose de dénué de sens.
J'ai lu qu'il faut utiliser `rune`, mais je ne comprends pas comment exactement. J'ai essayé ceci :
```go
r := []rune(s)
fmt.Println(string(r[0])) // Maintenant affiche 'П'
```
Cela fonctionne, mais je ne comprends pas pourquoi. Qu'est-ce qu'une `rune` en réalité ? Est-ce juste un `int32` ? Ou est-ce autre chose ? Pourquoi ce type est-il nécessaire si on peut se contenter d'octets ?
Expliquez, s'il vous plaît, comment fonctionnent les strings, les bytes et les runes en Go.