go语言rune类型是个啥

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类型来进行处理。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注