浅析Golang中rune类型的使用

 更新时间:2023年05月17日 17:08:10   作者:人艰不拆_zmc  
从golang源码中看出,rune关键字是int32的别名(-231~231-1),对比byte(-128~127),可表示的字符更多,本文就来简单聊聊它的使用方法吧,希望对大家有所帮助

1、概述

经常在开源库中看到rune关键字,从golang源码中看出,它是int32的别名(-231~231-1),对比byte(-128~127),可表示的字符更多。

2、使用

由于rune可表示的范围更大,所以能处理一切字符,当然也包括中文字符。在平时计算中文字符,可用rune。

查询官方的解释如下:

// 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.
 
//int32的别名,几乎在所有方面等同于int32
//它用来区分字符值和整数值
 
type rune = int32

这样可能还是对rune的作用与意义比较懵逼,我们通过两个简单的示例来看下rune的作用。

示例一:

package main
 
import "fmt"
 
func main() {
 
    var str = "hello 你好"
    fmt.Println("len(str):", len(str))
 
}

输出:

//输出,注意在golang中一个汉字占3个byte
len(str): 12

golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。

那么?如果我们预期想得到一个字符串的长度,而不是字符串底层占得字节长度,该怎么办呢???

package main
 
import (
    "fmt"
    "unicode/utf8"
)
 
func main() {
 
    var str = "hello 你好"
 
    //golang中string底层是通过byte数组实现的,直接求len 实际是在按字节长度计算  所以一个汉字占3个字节算了3个长度
    fmt.Println("len(str):", len(str))
     
    //以下两种都可以得到str的字符串长度
     
    //golang中的unicode/utf8包提供了用utf-8获取长度的方法
    fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
 
    //通过rune类型处理unicode字符
    fmt.Println("rune:", len([]rune(str)))
}

输出:

len(str): 12
RuneCountInString: 8
rune: 8

示例二:

package main
 
import "fmt"
 
func main() {
    s := "abc你好"
    r := "123你好"
    fmt.Println("len(s)=", len([]byte(s)), "len(r)=", len([]rune(r))) //len(s)= 9 len(r)= 5
 
    for k, v := range r {
        fmt.Println("k=", k, "v=", v)
    }
 
    for k, v := range []rune(r) {
        fmt.Println("k2=", k, "v2=", v)
    }
}

用range遍历包含中文的字符串时,会发现第一个for中k的值为0,1,2,3,6;第二个for中k的值为0,1,2,3,4;说明字符串中如果包含中文,range的时候可以识别出来,一个中文占用3个byte,索引就自动加三;而rune索引则只会加一。 

3、总结

golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,golang默认编码是utf-8。如果想得到字符串真正的长度(一个中文算一位),需要将字符串转换为rune,再求长度。

golang中byte数据类型与rune相似,它们都是用来表示字符类型的变量类型。它们的不同在于:

  • byte 等同于int8,常用来处理ascii字符
  • rune 等同于int32,常用来处理unicode或utf-8字符

到此这篇关于浅析Golang中rune类型的使用的文章就介绍到这了,更多相关Golang rune类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 详解Go中gin框架如何实现带颜色日志

    详解Go中gin框架如何实现带颜色日志

    当我们在终端上(比如Goland)运行gin框架搭建的服务时,会发现输出的日志是可以带颜色的,那这是如何实现的呢?本文就来和大家简单讲讲
    2023-04-04
  • Go语言使用时会遇到的错误及解决方法详解

    Go语言使用时会遇到的错误及解决方法详解

    这篇文章主要为大家详细介绍了Go语言使用时常常会遇到的一些错误及解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07
  • Golang协程池gopool设计与实现

    Golang协程池gopool设计与实现

    本文主要介绍了Golang协程池gopool设计与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • golang的序列化与反序列化的几种方式

    golang的序列化与反序列化的几种方式

    这篇文章主要介绍了golang的序列化与反序列化的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • GoLang sync.Pool简介与用法

    GoLang sync.Pool简介与用法

    这篇文章主要介绍了GoLang sync.Pool简介与用法,Pool是可伸缩、并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象重用机制,缓解GC压力,提高程序性能
    2023-01-01
  • golang中使用匿名结构体的方法

    golang中使用匿名结构体的方法

    这篇文章主要介绍了golang中使用匿名结构体,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • golang xorm日志写入文件中的操作

    golang xorm日志写入文件中的操作

    这篇文章主要介绍了golang xorm日志写入文件中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GO 函数式选项模式(Functional Options Pattern)

    GO 函数式选项模式(Functional Options Pattern)

    Option模式支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性,任意顺序传递参数,下面给大家介绍GO 函数式选项模式(Functional Options Pattern)的相关知识,感兴趣的朋友一起看看吧
    2021-10-10
  • go日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Go开发环境搭建详细介绍

    Go开发环境搭建详细介绍

    由于目前网上Go的开发环境搭建文章很多,有些比较老旧,都是基于 GOPATH的,给新入门的同学造成困扰。以下为2023 版 Go 开发环境搭建,可参照此教程搭建Go开发环境,有需要的朋友可以参考阅读
    2023-04-04

最新评论