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
本文链接:http://www.yunweipai.com/41974.html