内容简介:转载:在 golang 有兩個保留字new 可以用來初始化泛型,
Golang 中make与new 区别
在 golang 有兩個保留字 make
與 new
,也是剛開始學習 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
make
與 new
不同,是用來初始化一些特別的型別,像是 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
}
結論
make
與 new
在剛開始學習 golang 時容易搞混,有時參數要傳入指標時也會一不小心就用 make 來傳,這時候知道這兩者的區別就相當重要。
更多閱讀
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
一只小鸟告诉我的事
[美]比兹·斯通 / 顾雨佳 / 中信出版社 / 2014-11 / 59.00元
比兹•斯通,无疑是自乔布斯后的又一个硅谷奇迹! 70后的他,出身贫苦,一无所有,却又特立独行,充满智慧。从他这本自传中,我们知道他和乔布斯一样,大学都没读完就辍学做了一名图书封面设计师,然后创建了赞架(Xanga)网站,又进了谷歌。在经济上打了翻身仗后,他毅然放弃了安逸的生活,从零开始,和朋友创建了世界最知名的社交平台推特(Twitter)。当推特奇迹般地改变着世界时,他又悄然离去,创建了自......一起来看看 《一只小鸟告诉我的事》 这本书的介绍吧!