new 和 make

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

相關文章
相關標籤/搜索