聊聊GO初始化資料結構的方法(附程式碼範例)

2023-01-03 18:01:46
本篇文章給大家介紹有關GO語言初始化資料結構的方法,GO裡面提供了2個關鍵字來進行初始化資料結構,下面一起看看怎麼使用吧~希望對大家有所幫助。

使用 golang 進行編碼過程中,你們都是如何初始化資料結構的呢?

GO 裡面提供了 2 個關鍵字來進行初始化資料結構

  • new
  • make

不過有時候我也會直接使用花括號的方式直接就初始化,例如這樣:

name := []string{"xiaomotong","bob","marry"}
登入後複製

上面這種情況,是初始化的時候已經明確好了需要填的值,可以使用上面這種做法,不過工作中大多數情況初始化的時候,資料還是未知的,大部分時間還是會使用上述兩種方式

make

make 是 golang 提供的關鍵字,主要是用於初始化內建的資料結構,不能初始化自定義的資料結構 , make 可以初始化的資料型別有:

  • slice 切片
  • map hash表
  • channel 通道

例如我們初始化的時候就可以這樣寫

  • 初始化一個切片,填入 len 值, cap 值,切片底層的資料結構除了這倆值以外,還有一個指標,指向的是一個底層陣列
  • 初始化一個 map,map 的底層是指向一個 hmap 的結構體指標,結構體裡面的具體成員感興趣的 xdm 可以翻看我的歷史文章
  • 初始化一個通道 ch,這個 ch 是指向一個 hchan 的結構體指標,同樣也可翻看我的歷史文章看細節
strs := make([]string, 0, 10)myMap := make(map[string]string, 10)ch := make(chan struct{}, 10)
登入後複製

我們檢視 make 的原始碼解釋可以看到,make 確實支援建立和初始上述 3 種型別

fffa01be322685c93f2a9ab813a16dc.jpg

根據解釋,我們知道,make 的返回值的型別與填入引數的型別保持一致,咱們填入的是切片型別,那麼返回值就是切片型別,填入其他型別對應返回值也是我們期望的型別,沒毛病

new

那麼為什麼有了 make 做資料結構的初始化,還需要 new 幹啥?

細心的 胖魚 可以看出來,前面說到了 make 只適用於初始化 golang 提供的內建資料結構,對於自定義的資料結構,就捉襟見肘了 , 這個時候還是需要 new 出馬擺平了

用 new 初始化資料結構可以這樣寫:

  • 自定義一個結構體,裡面 2 個成員, age 和 name
  • 使用 new 對 T 最初始化,返回一個結構體的指標
type T struct{
    age int
    name string}func main(){

    t := new(T)
    fmt.Println("t.name == ",t.name)
    fmt.Println("t.age == ",t.age)}
登入後複製

程式執行效果如下:

# go run main.got.name ==t.age ==  0
登入後複製

果然是給我初始化了資料結構,只不過資料都是 零值

當然我們也可以這樣寫:

func main(){

    a := new(int)
    fmt.Println("a == ",a)
    fmt.Println("*a == ",*a)}
登入後複製

程式執行效果如下:

# go run main.goa ==  0xc420018078
*a ==  0
登入後複製

根據程式執行結果,我們知道 new 返回的是一個指標,且這個指標指向的記憶體地址上對應的值是一個該型別的 零值

瞅一眼 new 原始碼說明

467037444f85681361eefb1dd994f66.jpg

golang 原始碼中說到, new 的第一個引數是 資料型別,不是一個值,並且 new 的返回值是一個根據引數型別分配零值記憶體的指標

因此,我們上面看到的 new 出來的資料結構,列印出來的資料都是對應型別的零值

make 和 new 的區別

最後再來梳理一下 make 和 new 的區別,加深印象

  • make 只能用來初始化內建資料型別

    • slice

    • map

    • chan

      而 new 可以分配任意型別的資料(包括自定義資料型別)

  • make 返回的是參照,是 Type 型別,new 返回的是指標,是 *Type 型別的

【相關推薦:】

以上就是聊聊GO初始化資料結構的方法(附程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!