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