golang ---rune与byte
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的更多相关文章
- rune和byte在处理字符/字符串中的应用.
rune和byte在处理字符/字符串中的应用. 定义: rune是int32的别名,-2147483648->2147483647,常用来表示UNICODE字符集,可以用来处理包含中文/非中文的 ...
- golang string和[]byte的对比
golang string和[]byte的对比 为啥string和[]byte类型转换需要一定的代价?为啥内置函数copy会有一种特殊情况copy(dst []byte, src string) in ...
- go中rune和byte的用处
参考:https://www.jianshu.com/p/4fbf529926ca rune是用来区分字符值和整数值的 byte 等同于int8,即一个字节长度,常用来处理ascii字符 rune 等 ...
- golang ----rune数据类型
查询,官方的解释如下: // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by ...
- go 中string[0]到底是rune还是byte?
好像没区别,对吧? 来看个全面的对比: package main import ( "fmt" "reflect") func main(){ asci:=&q ...
- golang——rune
byte 等同于int8,常用来处理ascii字符 rune等同于int32,常用来处理unicode或utf-8字符//可以处理中文
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
- golang --rune
rune 是int32的别名类型,专用于存储Unicode编码的单个字符 我们可以用5种方式来表示一个rune字面量: 该rune字面量所对应的字符,如'a'必须是Unicode编码规范所支持的 使用 ...
- 【记录一个问题】golang中copy []byte类型的slice无效,为什么?
有这样一段代码: src := []byte{xxxxx} dst := make([]byte, 0, len(src)) copy(dst, src) //这一行居然没生效! // dst = a ...
随机推荐
- 完整且易读的最新版小程序登录态和检验注册过没的app.js写法
目录 0.可参考的官方页面 1.流程 2.app.js代码 3.java后台怎么通过code获取openId 0.可参考的官方页面 获取登录凭证:https://developers.weixin.q ...
- ta和夏天一起来了
目录 ta和夏天一起来了 上半年,过去的就让去过去,遗憾的也别再遗憾. 下半年,拥有的请好好珍惜,想要的请努力去追. ta和夏天一起来了 转眼结束了2019的上半年,在这个月末, 季度末, 周末, ...
- 下载win10系统
有时候想重装系统但总找不到下载的地方,今天记录一下.nsdn我告诉你,这里有许多软件下载 网站URL:https://msdn.itellyou.cn/ 我想下载一个Windows10 磁力地址 ed ...
- Python学习日记(四十一) Mysql数据库篇 九
前言 索引的主要作用是起到约束和加速查找,ORM框架(sqlalchemy)是用类和对象对数据库进行操作 索引的种类 按种类去分 1.普通索引:能够加速查找 2.主键索引:能够加速查找.不能为空.不能 ...
- Django ORM (二) 增加操作
数据库表结构生成完毕后,可以使用工具连接上去 在 app01_author 表创建基础记录 在 app01_publisher 表创建基础记录 添加 data_oper 方法 在 urls.py 文件 ...
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- Ningx的基本使用
Ningx的基本使用 user www; worker_processes 2; error_log logs/error.log info; pid logs/nginx.pid; even ...
- 《Pro Continuous Delivery With Jenkins 2.0》随书笔记
今天同时看完<Pro Continuous Delivery With Jenkins 2.0>, 这书与工作关系很大,但也是快速翻翻. 本书着重点jenkins高可用环境搭建,与gith ...
- 05-C#笔记-基本变量
1. 不支持括号初始化: 2. 支持强制类型转化: 3.运算规则同C++ 参考: http://www.runoob.com/csharp/csharp-variables.html
- USACO Protecting the Flowers
洛谷 P2878 [USACO07JAN]保护花朵Protecting the Flowers 洛谷传送门 JDOJ 1009: 护花 JDOJ传送门 Description FJ出去砍木材去了,把N ...