美文网首页Go
Golang 中make与new 区别

Golang 中make与new 区别

作者: raincoffee | 来源:发表于2019-02-15 10:17 被阅读8次

    Golang 中make与new 区别

    转载: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 可以用來初始化泛型,並且返回儲存位址。所以通常我們會用指標變數來接 new 過後的型別。特別要注意的是,new 會自動用 zeroed value 來初始化型別,也就是字串會是"",number 會是 0,channel, func, map, slice 等等則會是 nil

    因為這個特性,如果我們對 map 做以下的操作的話,會出現 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 也可以根據自己想要傳入的值額外再做設定,但 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 的字串陣列
    }
    

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

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

    結論

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

    更多閱讀

    相关文章

      网友评论

        本文标题:Golang 中make与new 区别

        本文链接:https://www.haomeiwen.com/subject/doqpeqtx.html