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是如何工作的。