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

相关文章
相关标签/搜索