Avatar ·

Go中的rune(符文)是什么,它与普通字节有何不同?

我刚开始学习Go,遇到了一个奇怪的东西——`rune`类型。它看起来像是一个整数,但为什么需要单独的类型?我尝试处理字符串时发现,当我按索引获取字符时,得到的是奇怪的数字,而不是字母。 下面是一个让我困惑的例子: ```go package main import "fmt" func main() { s := "Привет, мир!" fmt.Println(s[0]) // 输出208,而不是'П' fmt.Println(string(s[0])) // 输出'Ð',而不是'П' } ``` 为什么会这样?我期望`s[0]`能给我字符串的第一个字符。但实际得到的是垃圾数据。 我读到需要使用`rune`,但不知道具体怎么用。我尝试了这样: ```go r := []rune(s) fmt.Println(string(r[0])) // 现在输出'П' ``` 这有效,但我不明白为什么。`rune`到底是什么?它只是`int32`吗?还是别的什么?如果可以用字节处理,为什么还需要这个类型? 请解释一下Go中字符串、字节和rune是如何工作的。