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