rune它是int32的别名(-2147483648~2147483647),相比于byte(-128~127),可表示的字符更多。由于rune可表示的范围更大,所以能处理一切字符,当然也包括中文字符。在平时计算中文字符,可用rune。
len()详解
len()获得的是 byte 字节的数量,一个中文占用3个字节
s := "Hello王" sHello := "Hello" sWang := "王" //len()获得的是 byte 字节的数量 fmt.Println(len(s)) fmt.Println(len(sHello)) fmt.Println(len(sWang))
输出结果是:8 5 3
循环输出字符串
s := "Hello王" for i := 0; i < len(s); i++ { fmt.Printf("%c\n", s[i]) }
输出结果:
我们发现英文可以正常输出,但是中文通过这种方式输出会乱码
循环输出中文字符串
我们可以通过for range循环,从字符串中拿出具体的字符
s := "Hello王" for _, c := range s { fmt.Printf("%c\n", c) //%c 字符 }
输出结果:
字符串的修改
字符串修改是不能直接修改的,需要转成rune切片后再修改
s2 := "小白兔" s3 := []rune(s2) //把字符串强制转成rune切片 s3[0] = '大' //注意 这里需要使用单引号的字符,而不是双引号的字符串 fmt.Println(string(s3)) //把rune类型的s3强转成字符串
输出结果:大白兔
字符和字符串的区别
c1 := "红" c2 := '红' fmt.Printf("c1的类型:%T c2的类型:%T \n", c1, c2) c3 := "H" c4 := 'H' fmt.Printf("c3的类型:%T c4的类型:%T \n", c3, c4)
输出结果:
c1的类型:string c2的类型:int32 c3的类型:string c4的类型:int32
总结:我们发现只要是双引号包裹的类型就是string,只要是单引号包裹的类型就是int32,也就是rune。和中英文无关。
知识点:rune的别名是int32
类型转换
n1 := 10 var f float64 f = float64(n1) fmt.Printf("f的类型是:%T f的值是:%v\n", f,f)
输出结果:
f的类型是:float64 f的值是:10
总结
字符串的修改要转成rune切片,而不能像PHP一样直接修改。
公众号:程序员升级打怪之旅
微信号:wangzhongyang1993