byte和rune类型
两种字符类型:
uint8
类型,或者叫 byte 型,代表了ASCII码
的一个字符。rune
类型,代表一个UTF-8字符
,本质是int32
类型。
rune
类型用于处理复合字符,如中文、日文等。
代码示例:
package main
import "fmt"
func main() {
s := "wo ai 中国"
// len(s) 返回的是s的字节数,而不是字符数
fmt.Println(len(s)) // 12
// 用 len(s) 逐个打印,实际是按字节输出,复合字符(占3~4个字节,如中文)会出现乱码
for i := 0; i < len(s); i++ { //byte
fmt.Printf("%v(%c) ", s[i], s[i])
}
fmt.Println()
fmt.Printf("%T\n", s[0]) // uint8
// 隐式声明时,字符默认是 rune 类型,即 int32 类型
c := '1'
fmt.Printf("%T\n", c) // int32
// 用 range 循环可以正确输出字符
for _, r := range s { //rune
fmt.Printf("%v(%c) ", r, r)
}
}
输出:
12
119(w) 111(o) 32( ) 97(a) 105(i) 32( ) 228(ä) 184(¸) 173() 229(å) 155(›) 189(½)
uint8
int32
119(w) 111(o) 32( ) 97(a) 105(i) 32( ) 20013(中) 22269(国)
字符串修改
字符串底层是一个 byte 数组,所以可以和 []byte 或 []rune 类型相互转换;字符串是不能修改的,需要先进行转换,修改后再转换为string
。无论哪种转换,都会重新分配内存,并复制字节数组。
代码示例:
s2 := "ai中国"
// 强制类型转换
// 转换为 []byte 类型
byteS2 := []byte(s2)
// 转换为 []rune 类型
runeS2 := []rune(s2)
byteS2[1] = 'h'
runeS2[3] = '华'
// 强制转换回 string 类型,并输出
fmt.Println(string(byteS2)) // ah中国
fmt.Println(string(runeS2)) // ai中华