Go 裏面爲啥特喜歡用 []byte?
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。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/2LzhQn4dRwReuh7d7nTa1Q