写点什么

你会用 Go 语言的 rune 类型吗?

作者:王中阳Go
  • 2022-10-19
    北京
  • 本文字数:898 字

    阅读完需:约 1 分钟

你会用Go语言的rune类型吗?

rune 它是 int32 的别名(-2147483648~2147483647),相比于 byte(-128~127),可表示的字符更多。

由于 rune 可表示的范围更大,所以能处理一切字符,当然也包括中文字符。在平时计算中文字符,可用 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 := 10var f float64f = float64(n1)fmt.Printf("f的类型是:%T f的值是:%v\n", f,f)
复制代码


输出结果:


f的类型是:float64 f的值是:10
复制代码

总结

字符串的修改要转成 rune 切片,而不能像 PHP 一样直接修改。

一起学习,升级打怪

我们搞了一个对学 Go 真正有帮助的群,欢迎加入:


公众号:程序员升级打怪之旅


微信号:wangzhongyang1993

发布于: 刚刚阅读数: 6
用户头像

王中阳Go

关注

公众号:程序员升级打怪之旅 2022-10-09 加入

微信:wangzhongyang1993

评论 (1 条评论)

发布
用户头像
当我们数据中有中文时,一定要注意 rune 的处理。
刚刚 · 北京
回复
没有更多了
你会用Go语言的rune类型吗?_Go_王中阳Go_InfoQ写作社区