您好,登錄后才能下訂單哦!
本篇內容主要講解“GO如何初始化數據結構”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“GO如何初始化數據結構”吧!
GO 里面提供了 2 個關鍵字來進行初始化數據結構
new
make
不過有時候我也會直接使用花括號的方式直接就初始化,例如這樣:
name := []string{"xiaomotong","bob","marry"}
上面這種情況,是初始化的時候已經明確好了需要填的值,可以使用上面這種做法,不過工作中大多數情況初始化的時候,數據還是未知的,大部分時間還是會使用上述兩種方式
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 種類型
根據解釋,我們知道,make 的返回值的類型與填入參數的類型保持一致,咱們填入的是切片類型,那么返回值就是切片類型,填入其他類型對應返回值也是我們期望的類型,沒毛病
那么為什么有了 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 返回的是一個指針,且這個指針指向的內存地址上對應的值是一個該類型的 零值
golang 源碼中說到, new 的第一個參數是 數據類型,不是一個值,并且 new 的返回值是一個根據參數類型分配零值內存的指針
因此,我們上面看到的 new 出來的數據結構,打印出來的數據都是對應類型的零值
最后再來梳理一下 make 和 new 的區別,加深印象
make 只能用來初始化內置數據類型
slice
map
chan
而 new 可以分配任意類型的數據(包括自定義數據類型)
make 返回的是引用,是 Type 類型,new 返回的是指針,是 *Type 類型的
到此,相信大家對“GO如何初始化數據結構”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。