//rune & byte 类型
//byte是uint8的别名类型,一个值就是一个ASCII码值。
//rune是int32的别名类型,一个值就代表一个Unicode字符。
//rune类型的值在底层都是由一个 UTF-8 编码值来表达的。
//Unicode字符,平时接触到的中英日文,或者复合字符,都是Unicode字符。
//UTF-8 编码方案会把一个 Unicode 字符编码为一个长度在 1~4 以内的字节序列。
//所以,一个rune类型值代表了1~4个长度的byte数组。
//一个string类型的值既可以被拆分为一个包含多个字符的序列,也可以被拆分为一个包含多个字节的序列。 前者可以由一个以rune为元素类型的切片来表示,而后者则可以由一个以byte为元素类型的切片代表。
//golang中的字符串底层实现是通过byte数组的,中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
func main() { str := "abc 学习" fmt.Println([]byte(str)) // [97 98 99 32 229 173 166 228 185 160] fmt.Println([]uint8(str)) // [97 98 99 32 229 173 166 228 185 160] fmt.Println([]rune(str)) // [97 98 99 32 23398 20064] fmt.Println([]int32(str)) // [97 98 99 32 23398 20064] //fmt.Println([]int8(str)) //错误,没有int8 fmt.Println(string([]byte(str))) //abc 学习 s := []byte{98} fmt.Println(string(s)) // b fmt.Println(string([]rune{20013})) // 中 fmt.Println(string(rune(20013))) // 中 fmt.Printf("长度byte:%v, 长度rune:%v, 长度utf8:%v", len(str), len([]rune(str)), utf8.RuneCountInString(str)) //长度byte:10, 长度rune:6, utf_str = for k, v := range str { fmt.Printf("\n索引:%v,值:%v", k, v) } //索引:0,值:97 //索引:1,值:98 //索引:2,值:99 //索引:3,值:32 //索引:4,值:23398 //索引:7,值:20064 for k, v := range []byte(str) { fmt.Printf("\n索引:%v,值:%v", k, v) } //索引:0,值:97 //索引:1,值:98 //索引:2,值:99 //索引:3,值:32 //索引:4,值:229 //索引:5,值:173 //索引:6,值:166 //索引:7,值:228 //索引:8,值:185 //索引:9,值:160 for k, v := range []rune(str) { fmt.Printf("\n索引:%v,值:%v,值:%v", k, v, string(v)) } //索引:0,值:97,值:a //索引:1,值:98,值:b //索引:2,值:99,值:c //索引:3,值:32,值: //索引:4,值:23398,值:学 //索引:5,值:20064,值:习 }