func main() {
u:=
new
(user)
u.lock.Lock()
u.name =
"張三"
u.lock.Unlock()
fmt.Println(u)
}
type user struct {
lock sync.Mutex
name string
age int
}
|
示例中的user類型中的lock字段我不用初始化,直接能夠拿來用,不會有無效內存引用異常,由於它已經被零值了。spa
這就是new,它返回的永遠是類型的指針,指向分配類型的內存地址。指針
兩者異同code
因此從這裏能夠看的很明白了,兩者都是內存的分配(堆上),可是make只用於slice、map以及channel的初始化(非零值);而new用於類型的內存分配,而且內存置爲零。因此在咱們編寫程序的時候,就能夠根據本身的須要很好的選擇了。內存
make返回的仍是這三個引用類型自己;而new返回的是指向類型的指針。ci
make也是用於內存分配的,可是和new不一樣,它只用於chan、map以及切片的內存建立,並且它返回的類型就是這三個類型自己,而不是他們的指針類型,由於這三種類型就是引用類型,因此就沒有必要返回他們的指針了。string
注意,由於這三種類型是引用類型,因此必須得初始化,可是不是置爲零值,這個和new是不同的。table