go 数据类型rune的使用与理解

duzhenxun · · 4519 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

我们知道golang的数据类型有布尔型,字符串型,数字类型,派生类型。rune它属于数字类型,类似in32。 官方解释: > // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. type rune = int32 翻译成中文:rune是int32的别名,在所有方面都等同于int32。它是按惯例,用于区分字符值和整数值。 看了官解我还没有了解其真正含义,rune一般用在哪?现在我通过2个例子来讲一下rune的使用。 ### 举例说明 #### 例子1:字符串截取 如我们要指定截取字符串的长度,因为golang的string底层就是一个byte数组,我们直接取数组的前N个即可完成这个需求 ```golang //要求截取前4个字符串,最后是"xs25" var str = "xs25.cn" fmt.Println(str[:4]) //运行后的结果:xs25 ``` 但这个如果在字符串中存在中文会不会有问题呢,我们以“小手25是什么”这个字符串为例来做个实验。 ```golang //要求截取前4个字符串,最后是"小手25" var str = "小手25是什么" fmt.Println(str[:4]) //结果: 小� ``` 运行后我们发现出现了乱码。为什么会出现乱码呢?正如我们所说golang的string底层是一个byte数组实现,中文字符串在unicode下占2个字节,在utf-8下占3个字节。我们golang默认编码是utf-8,所以是占用3个字节。通过len(str)可以证明一共数组长度是17,每个中文占用3个字节。 ```golang var str = "小手25是什么" fmt.Println(len(str)) //17 fmt.Println(str[:8]) //”小手25“共占8个字节 //结果:小手25 ``` 我们来一个取巧的方式行进字符串截取,即然字符串可以[]bype(str) 这样的方法转换,那我们也可以使用 []rune(str)这样的方式转换成一个切片,转换后我们取切片的前几个不就可以了吗。 ```golang var str = "小手25是什么" s:=[]rune(str) fmt.Println(len(s)) //长度只有 7,每字汉字当一个字节 fmt.Println(string(s[:4])) //取前4个,取出后转成string //结果:小手25 ``` #### 例子2:在N个字符串找到找没有重复字符,且字符串总长度最长的那个 ```golang ss := []string{ "ado", "duzhenxun", "小手25是什么", "来个长点的字符串,微信号5552123", } maxLenStr := "" for i := 0; i < len(ss); i++ { var repeat bool tmpArr := map[int32]int{} for k, v := range []rune(ss[i]) { if tmpArr[v] != 0 && len(tmpArr) > 0 { repeat = true //有重复 break } tmpArr[v] = k } //没有重复找最长的 if !repeat && len(ss[i])>len(maxLenStr){ maxLenStr = ss[i] } } fmt.Println("无重复最长的是:",maxLenStr) //结果:小手25是什么 ``` ### 知识扩展 在golang中的unicode/utf88包里提供了许多rune相关的方法自己可以多多尝试一下 ![title](https://upload-images.jianshu.io/upload_images/19018717-b6b559ef1cd6c1f6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 总结 即然开头我们说过 rune是int32的别名,在所有方面都等同于int32,那在上面的2个例子中。我们把rune改为int32也是一样效果 。 ```golang var str = "小手25是什么" s:=[]int32(str) fmt.Println(len(s)) //长度只有 7 fmt.Println(string(s[:4])) //取前4个,取出后转成string //结果:小手25 ``` 现在你是不是对golang的rune有了一定的了解!其实你常用的byte其实是uint8的别名,这也是官方的解释 > // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned // integer values. type byte = uint8 ![image.png](https://upload-images.jianshu.io/upload_images/19018717-c7f68ab05e2df710.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4519 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传