首页 Golang教程Go里面为啥特喜欢用[]byte?

Go里面为啥特喜欢用[]byte?

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

Go 语言里面没有继承, 想进一步剖析 byte 这个类型,我就需要更进一步的了解 type 这个关键字。

更进一步认识 type 关键字

我们在写 go 代码,定义结构体 type 这个关键字是必用。

比如:type Student struct

type 除了能定义自己的结构体之外,还支持重新定义现有的类型。

比如:type String string

这样做有啥好处呢?

最重要的一点:可以对类型进行扩展

自定义一个自己的字符串类型

在某些时候我们可能发现原生的 string 类型他提供的 func 并不能很好的支持我们项目。

我们会经常用到一些特有的 func 和 string 类型关系又非常的密切。

我们就可以定义自己的 string,他和其他语言的继承非常类似。

type String string

然后我们就可以基于 String 这个类型进行扩展 func 了。

// 从 string 构建 String 类型
func From(str string) String {
 return String(str)
}
// 获取 String 的长度
func (this String) Len() int {
 return len(this)
}

我们这样定义出来的类型,他既具有 string 类型的所有特性,又具有了我们扩展的类型。

实现一个 JS 里面的 forEach

我们在 js 里面处理数组往往会用到这样的代码:

let val = [1,3,5]
val.forEach(item=>{
    console.log(item)
})

但是我们的 go 并不支持这种扩展,所以我们可以基于 type 这个特性,扩展一个。

我这里就直接基于 string 类型扩展了哈:

func (this String) Each(fn func(item string)) {
 for i := 0; i < len(this); i++ {
  fn(fmt.Sprintf("%c",this[i]))
 }
}

咋使用呢?

s := String.From("GoLang全栈123")
s.Each(func(item string) {
 fmt.Println(item)
})

// 执行结果
G
o
L
a
n
g
å

¨
æ
 

1
2
3

你会发现,出现乱码了,这是因为字符编码的问题, %c 是单个字符输出的,我们的汉字他不是单字符的,如果不能理解欢迎阅读我们上一篇文章关于字符串的讲解。

我们只需要修改我们的扩展方法,不要使用按字节的方式遍历即可:

// 改良后的遍历
func (this String) Each(fn func(item string)) {
 for _, item := range this {
  fn(fmt.Sprintf("%c",item))
 }
}

// 执行结果
G
o
L
a
n
g
全
栈
1
2
3

这样我们的结果就正常了。

byte 和 rune

说了那么多铺垫,现在开始解析 byte 类型,我们用得最多的类型往往 []byte 这个类型。

比如 json 的处理中:

// json 解析
jsonString := []byte(`{"name": "zs"}`)
obj := map[string]string{}
json.Unmarshal(jsonString,&obj)
fmt.Println(obj)

// 执行结果
map[name:zs]

你有没想过,他为啥要转化成 []byte 类型呢?

我们点开 byte 的定义:

// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8

其实他是一个无符号的 int8 类型,还记得上一篇文章我们提到的 UTF-8 么?

没错,这刚好符合 UTF-8 的实现逻辑。

所以都转换成 unicode 了,再做其他处理就非常便利了哇。

紧接着下面就是 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.
type rune = int32

某些时候我们用 uint8 不够时,就会用升级一点的 int32。

你学废了么?

原文:https://mp.weixin.qq.com/s/2LzhQn4dRwReuh7d7nTa1Q

本文链接:https://www.yunweipai.com/41974.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部