go语言中除了常用的基本类型外,还提供了一种类型rune,那么rune是个啥玩意,为啥需要rune?
我们写rest接口的时候经常会有一种场景,就是判断字符串的长度,来进行范围的提示,打个比方,姓名最多6个字
那么我们会写出类似这样的代码
if len(name) > 6 {
return "姓名不能超过6位"
}
咋一看代码,似乎没有问题,看起来都正常;
这时一个叫“二狗子”的用户输入了自己的名字,开心的准备提交自己的信息,发现系统不管怎样,都提示”姓名不能超过6位”,“二狗子”这时傻眼了,气的只能投诉软件。收到投诉的程序员只能默默的含泪review自己的代码,最后发现len是不能直接这样用的,因为这里是中文字符。
那么rune就是解决这个问题的,啥也不说,看代码:

如果直接len(中文字符), 那么会当成byte来进行处理,“二狗子”转byte数组后变成了9个元素,长度是9,所以一直超过6,会收到错误的提醒;
我们这里期望的正确结果是3,因为“二狗子”从中文来讲是3个字,那么用rune处理后恰好是3个元素,所以得到我们期望的结果。
为什么会这样,因为中文字符的utf8编码是3个字节,golang默认编码也就是utf8,我们再看下byte和rune的源代码

byte是一个uint8类型的,差不多1字节,rune是int32类型的,差不多4字节;中文字符在默认golang编码utf8是三字节,按照byte类型来计算,一个中文,三个字节;rune包含多个字节,按照rune类型算,一个中文可能不到4字节,所以一个中文一个rune。
另外我们也可以使用range方法来遍历中文字符串,range会把字符当作rune类型来进行处理。