GO 裡面提供了 2 個關鍵字來進行初始化資料結構
不過有時候我也會直接使用花括號的方式直接就初始化,例如這樣:
name := []string{"xiaomotong","bob","marry"}
登入後複製
上面這種情況,是初始化的時候已經明確好了需要填的值,可以使用上面這種做法,不過工作中大多數情況初始化的時候,資料還是未知的,大部分時間還是會使用上述兩種方式
make 是 golang 提供的關鍵字,主要是用於初始化內建的資料結構,不能初始化自定義的資料結構 , make 可以初始化的資料型別有:
例如我們初始化的時候就可以這樣寫
strs := make([]string, 0, 10)myMap := make(map[string]string, 10)ch := make(chan struct{}, 10)
登入後複製
我們檢視 make 的原始碼解釋可以看到,make 確實支援建立和初始上述 3 種型別
根據解釋,我們知道,make 的返回值的型別與填入引數的型別保持一致,咱們填入的是切片型別,那麼返回值就是切片型別,填入其他型別對應返回值也是我們期望的型別,沒毛病
那麼為什麼有了 make 做資料結構的初始化,還需要 new 幹啥?
細心的 胖魚 可以看出來,前面說到了 make 只適用於初始化 golang 提供的內建資料結構,對於自定義的資料結構,就捉襟見肘了 , 這個時候還是需要 new 出馬擺平了
用 new 初始化資料結構可以這樣寫:
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 返回的是一個指標,且這個指標指向的記憶體地址上對應的值是一個該型別的 零值
golang 原始碼中說到, new 的第一個引數是 資料型別,不是一個值,並且 new 的返回值是一個根據引數型別分配零值記憶體的指標
因此,我們上面看到的 new 出來的資料結構,列印出來的資料都是對應型別的零值
最後再來梳理一下 make 和 new 的區別,加深印象
make 只能用來初始化內建資料型別
slice
map
chan
而 new 可以分配任意型別的資料(包括自定義資料型別)
make 返回的是參照,是 Type 型別,new 返回的是指標,是 *Type 型別的
【相關推薦:】
以上就是聊聊GO初始化資料結構的方法(附程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!