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

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

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

package main

import (
"fmt"
) func main() {
str := "世界"
fmt.Println(len(str)) //6
}

 

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

package main

import (
"fmt"
"unicode/utf8"
) func main() {
str := "世界"
fmt.Println(utf8.RuneCountInString(str))//2 }

结果是2

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

package main

import (
"fmt"
) func main() {
str := "hello 世界"
str2 := []rune(str)
fmt.Println(len(str2)) //8 }

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

package main

import (
    "fmt"
)

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

}

  

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

字符串的遍历

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

package main

import (
"fmt"
) func main() {
str := "hello 世界" for i := 0; i < len(str); i++ {
fmt.Println(string(str[i]))
} }

  

输出:

h
e
l
l
o ä
¸
–
ç

  

如何解决这个问题呢?

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

package main

import (
"fmt"
) func main() {
str := "hello 世界" for _, v := range str {
fmt.Println(string(v))
}
}

 输出

h
e
l
l
o 世

 原因是range会隐式的unicode解码

第二个方法是将str 转换为rune类型的切片

package main

import (
"fmt"
) func main() {
str := "hello 世界"
str2 := []rune(str) for i := 0; i < len(str2); i++ {
fmt.Println(string(str2[i]))
} }

  

 输出

h
e
l
l
o 世

 

rune和byte的区别

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

golang ---rune与byte的更多相关文章

  1. rune和byte在处理字符/字符串中的应用.

    rune和byte在处理字符/字符串中的应用. 定义: rune是int32的别名,-2147483648->2147483647,常用来表示UNICODE字符集,可以用来处理包含中文/非中文的 ...

  2. golang string和[]byte的对比

    golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) in ...

  3. go中rune和byte的用处

    参考:https://www.jianshu.com/p/4fbf529926ca rune是用来区分字符值和整数值的 byte 等同于int8,即一个字节长度,常用来处理ascii字符 rune 等 ...

  4. golang ----rune数据类型

    查询,官方的解释如下: // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by ...

  5. go 中string[0]到底是rune还是byte?

    好像没区别,对吧? 来看个全面的对比: package main import ( "fmt" "reflect") func main(){ asci:=&q ...

  6. golang——rune

    byte 等同于int8,常用来处理ascii字符 rune等同于int32,常用来处理unicode或utf-8字符//可以处理中文

  7. golang struct 和 byte互转

    相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...

  8. golang --rune

    rune 是int32的别名类型,专用于存储Unicode编码的单个字符 我们可以用5种方式来表示一个rune字面量: 该rune字面量所对应的字符,如'a'必须是Unicode编码规范所支持的 使用 ...

  9. 【记录一个问题】golang中copy []byte类型的slice无效,为什么?

    有这样一段代码: src := []byte{xxxxx} dst := make([]byte, 0, len(src)) copy(dst, src) //这一行居然没生效! // dst = a ...

随机推荐

  1. 外汇盈利EA

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  2. CDA数据分析【数据收集】

    一.机器收集数据 机器收集数据会从不同角度对数据进行抓取和采集,与之前手动收集数据不同,机器收集数据不再是用小样本.特定样本来采集和分析整体数据,而是采用大样本或整体数据进行分析,这打破了原来的数据分 ...

  3. 『计算机视觉』imgaug图像增强库中部分API简介

    https://github.com/aleju/imgaug 介绍一下官方demo中用到的几个变换,工程README.md已经给出了API简介,个人觉得不好理解,特此单独记录一下: import n ...

  4. django 权限设置-菜单显示

    问题:在用户登录后,如何只显示出用户权限的菜单呢?需要设置显示菜单权限 1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串) 在rbac中录入另一 ...

  5. axios跨域处理

    本质分析: 因为axios在vue中利用中间件http-proxy-middleware做了一个本地的代理服务A,相当于你的浏览器通过本地的代理服务A请求了服务端B,浏览器通过服务A并没有跨域,因此就 ...

  6. woocommerce分类页产品数量修改

    我们用woocommerce建商城,不同的模板分类页产品数量不同,如果想要显示更多或更少的数量要如何修改呢?很简单,一行代码就能搞定!打开当前主题的function.php文件,加入如下代码,把18改 ...

  7. phpcms站点域名配置https无法提交如何处理

    一位网友给ytkah反映说phpcms站点域名配置https无法提交,在后台修改站点域名为https提交后提示“站点域名格式应该为http://www.phpcms.cn/,请以‘/’结束”,这个要如 ...

  8. (二)STM32开发例程

    1控制LED和继电器 除了 PA11和PA12其他都可以 void setup() { pinMode(PC13, OUTPUT); pinMode(PC14, OUTPUT); pinMode(PC ...

  9. 深入js系列-环境

    javascript运行环境 js如果只在引擎中运行,它会严格遵循并且可以预测的,但是js几乎都在宿主环境中运行,浏览器或者Node环境 ECMAScript中的Annex B 介绍了浏览器兼容性问题 ...

  10. nodejs进程管理

    NodeJS可以感知和控制自身进程的运行环境和状态,也可以创建子进程并与其协同工作,这使得NodeJS可以把多个程序组合在一起共同完成某项工作,并在其中充当胶水和调度器的作用. 我们已经知道了Node ...