字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
Go语言的字符有以下两种:
- 一种是 byte 型,是 uint8 的别名,代表了 ASCII 码的一个字符。
- 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
字符集
Unicode 与 ASCII 类似,都是一种字符集。
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。
案例
package main
import "fmt"
/*
尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。
string 类型的值是只读的二进制 byte slice,如果真要修改字符串中的字符,将 string 转为 []byte 修改后,再转为 string 即可
*/
func main() {
s1 := "Hello"
// bad
//s1[1] = 'a'
// good
sBytes := []byte(s1)
sBytes[1] = 'a'
s2 := string(sBytes)
fmt.Println(s2) //Hallo
}
package main
import "fmt"
/*
之前的示例并不是更新字符串的正确姿势,因为一个 UTF8 编码的字符可能会占多个字节,比如汉字就需要 3~4个字节来存储,此时更新其中的一个字节是错误的。
更新字串的正确姿势:将 string 转为 rune slice(此时 1 个 rune 可能占多个 byte),直接更新 rune 中的字符
*/
func main() {
s1 := "Hello"
// bad
//sBytes := []byte(s1)
//sBytes[1] = '嗨'
// good
sBytes := []rune(s1)
sBytes[1] = '嗨'
s2 := string(sBytes)
fmt.Println(s2) //H嗨llo
}