Golang 中make與new 區(qū)別

Golang 中make與new 區(qū)別

轉載:https://medium.com/d-d-mag/golang-%E7%AD%86%E8%A8%98-make-%E8%88%87-new-%E7%9A%84%E5%B7%AE%E5%88%A5-68b05c7ce016

在 golang 有兩個保留字 makenew,也是剛開始學習 golang 的時候容易搞混的地方,這邊做個簡單的筆記。

new

new 可以用來初始化泛型,並且返回儲存位址。所以通常我們會用指標變數(shù)來接 new 過後的型別。特別要注意的是,new 會自動用 zeroed value 來初始化型別,也就是字串會是"",number 會是 0,channel, func, map, slice 等等則會是 nil

因為這個特性,如果我們對 map 做以下的操作的話,會出現(xiàn) panic: assignment to entry in nil map

func main() {
    people := new(map[string]string)
    p := *people
    p["name"] = "Kalan" // panic: assignment to entry in nil map
}

因為初始化的 map 會是 nil map,不像其他的 primitive type 一樣有預設值。

如果用 struct 做初始化,也可以直接用 & 代表指向的位址,下面兩個寫法效果是一樣的:

type Person struct {
  Name string
  Age  int
}

func main() {
    p := &Person{}
    p := new(Person)
}

好處是上面的 Person 也可以根據(jù)自己想要傳入的值額外再做設定,但 new 則是全部的 field 都會直接塞 zeroed value。

make

makenew 不同,是用來初始化一些特別的型別,像是 channel, map, slice 等等。另外特別要注意的是 make 並不會回傳指標,如果要拿到指標,就要考慮用像是 new 的方式來初始化型別。

func main() {
    receiver := make(chan string) // 初始化 channel,但不回傳指標
    person := make(map[string]string)
    people := make([]string, 100) // 初始化長度為 100 的字串陣列
}

還是要再度強調(diào)一次,make 不會回傳指標!下面這段程式碼會噴錯:

func main() {
    person := make(map[string]string)
    fmt.Println(*person) // invalid indirect of person
}

結論

makenew 在剛開始學習 golang 時容易搞混,有時參數(shù)要傳入指標時也會一不小心就用 make 來傳,這時候知道這兩者的區(qū)別就相當重要。

更多閱讀

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 《達爾文所未知的》解說詞 撰寫(Written):阿爾芒·馬裏耶(The Animal Mother) 翻譯(Tr...
    JENTSON閱讀 1,626評論 0 1
  • 自然衝擊療法由丁愚仁老師發(fā)明,又稱「禪拍」,「拍打」,"自然拍打"。 丁師及其團隊總結經(jīng)驗,不同的各種病癥(含絕癥...
    YouAreMyMusic閱讀 2,666評論 0 4
  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關系?...
    Zero___閱讀 3,324評論 3 49
  • 我妹妹不喜歡做家務,超懶。我媽好幾年前跟我抱怨,以后怎樣嫁人。當時的我淡定的說,放心,她會找到做家務的老公,包容她...
    伊一娓娓閱讀 168評論 0 1
  • 兒子在外地上大學,不定時地要和爸媽聊聊天,今天晚上,孩子爸爸和兒子視頻聊了一會,兒子說起腳上的甲溝炎又犯了,不能去...
    江南夜雨十年燈閱讀 300評論 0 1

友情鏈接更多精彩內(nèi)容