【golang】浅析rune,byte

18人阅读 评论(0) 收藏 举报
分类:

【golang】浅析rune,byte

golang内置类型有rune类型和byte类型。

需要知晓的是rune类型的底层类型是int32类型,而byte类型的底层类型是int8类型,这决定了rune能比byte表达更多的数。

在unicode中,一个中文占两个字节,utf-8中一个中文占三个字节,golang默认的编码是utf-8编码,因此默认一个中文占三个字节,但是golang中的字符串底层实际上是一个byte数组。因此可能会出现下面这种奇怪的情况

str := "hello 世界"
fmt.Println(len(str)) //12

我们期望得到的结果应该是8,原因是golang中的string底层是由一个byte数组实现的,而golang默认的编码是utf-8,因此在这里一个中文字符占3个字节,所以获得的长度是12,想要获得我们想要的结果也很简单,golang中的unicode/utf8包提供了用utf-8获取长度的方法

str := "hello 世界"
fmt.Println(utf8.RuneCountInString(str)) //8

上面说了byte类型实际上是一个int8类型,int8适合表达ascii编码的字符,而int32可以表达更多的数,可以更容易的处理unicode字符,因此,我们可以通过rune类型来处理unicode字符

str := "hello 世界"
str2 := []rune(str)
fmt.Println(len(str2)) //8

这里会将申请一块内存,然后将str的内容复制到这块内存,实际上这块内存是一个rune类型的切片,而str2拿到的是一个rune类型的切片的引用,我们可以很容易的证明这是一个引用

str := "hello 世界"
str2 := []rune(str)
t := str2
t[0] = 'w'
fmt.Println(string(str2)) //“wello 世界”

通过把str2赋值给t,t上改变的数据,实际上是改变的是t指向的rune切片,因此,str也会跟着改变

字符串的遍历

对于字符串,看一下如何遍历吧,也许你会觉得遍历轻而易举,然而刚接触golang的时候,如果这样遍历字符串,那么将是非常糟糕的

str := "hello 世界"

for i := 0;i < len(str);i++ {
    fmt.Println(string(str[i]))
}

输出:

h
e
l
l
o

ä
¸
ç

如何解决这个问题呢?

第一个解决方法是用range循环

str := "hello 世界"

for _,v := range str {
    fmt.Println(string(v))
}

输出

h
e
l
l
o

界

原因是range会隐式的unicode解码

第二个方法是将str 转换为rune类型的切片,这个方法上面已经说过了,这里就不再赘述了

当然还有很多方法,其本质都是将byte向rune上靠

rune和byte的区别

除开rune和byte底层的类型的区别,在使用上,rune能处理一切的字符,而byte仅仅局限在ascii

查看评论

golang byte和rune的区别

我们知道golang中的string类型存储的字符串是不可变的, 如果要修改string内容需要将string转换为[]byte或[]rune,并且修改后的string内容是重新分配的。       ...
  • csCrazybing
  • csCrazybing
  • 2018-01-19 15:46:16
  • 784

string rune byte 的关系

http://www.golangtc.com/t/528cc004320b52227200000f 在Go当中 string底层是用byte数组存的,并且是不可以改变的。 例...
  • muscledex
  • muscledex
  • 2017-05-02 14:44:57
  • 597

go - 内置基础类型

Go 语言中包括以下内置基础类型: 布尔型:bool 整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint 浮点型:f...
  • chuangrain
  • chuangrain
  • 2013-07-02 12:32:23
  • 14214

Go语言核心之美 2.5-字符串

字符串是不可变的字节序列,可以包含任意数据,包括0这个字节,不过通常是用来包含可读性较强的文本。文本字符串通常采用UTF-8编码,由Unicode码点(rune)组成。 内置的len函数会返回字符串的...
  • abv123456789
  • abv123456789
  • 2016-03-17 18:06:20
  • 5178

golang 中unicode包用法

本文转自Golove博客:http://www.cnblogs.com/golove/p/3273585.html
  • chenbaoke
  • chenbaoke
  • 2014-10-20 20:59:49
  • 3204

golang string和[]byte的对比

为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) int?string和[]byte,底层都是数组,但...
  • liduanwh
  • liduanwh
  • 2018-04-16 09:58:52
  • 9

Go打印函数printf格式简介

fmt.print参数规约printf输出规约是按照预定义好的参数格式输出的,参数和对应说明如下表所示。 parameter description %d decimal integer...
  • GreatElite
  • GreatElite
  • 2016-05-22 16:36:54
  • 1594

Go语言学习(十)bytes包处理字节切片

bytes包提供了对字节切片进行读写操作的一系列函数 字节切片处理的函数比较多,分为基本处理函数,比较函数,后缀检查函数,索引函数,分割函数, 大小写处理函数和子切片处理函数等. 1.字节...
  • mChenys
  • mChenys
  • 2016-04-02 17:04:59
  • 6803

Golang(Go语言)代码技巧之字符串(string)

改变字符串中的某些字符 str := "hello roc"bytes := []byte(str)bytes[1] = 'a'str = string(bytes) //str == "hal...
  • QQ245671051
  • QQ245671051
  • 2016-02-24 21:32:55
  • 17350

Golang -- 函数

Golang 函数的使用
  • xiaorenwuzyh
  • xiaorenwuzyh
  • 2015-03-25 12:02:18
  • 1272
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 13万+
    积分: 2590
    排名: 1万+
    博客专栏
    最新评论