make
make 内建函数,只能用来作为 slice、map 和 channel 的声明,返回的是类型本身,而不是指针,因为它们本身就是一个引用类型。并且会对其进行一些初始化操作。例如,slice 在创建时,会初始化底层数组,并且初始化 slice 的长度、指针和容量等基础数据。
s := make([]int, 0, 5) // 创建 slice
m := make(map[string]int) // 创建 map
c := make(chan int) // 创建 channel
new
new 与 make 不同,使用 new 声明的类型,会同时分配一块内存,分配内存后,会返回指向该类型内存地址的指针,并且将会被分配为该类型的零值。下面这个例子可以看到这一做法的好处:
type People struct {
Name string
Age int8
}
type User struct {
People
Psw string
}
func f () {
var u = new(User)
fmt.Println(fmt.Sprintf("%s", u.Name))
}
这里,如果没有这个机制,以上代码在调用输出 u.Name 这里将会产生一个 nilPoint 的 panic。但是,因为在 new 的时候,默认已经初始化了 User 以及 User 中所有字段为零值。所以,调用时就不会出现 panic。
两者对比
首先,两者都是用作变量声明时的内存分配,两者的内存分配空间都为堆。但是 make 只能声明 slice、map 与 channel,而 new 用于类型的内存分配,并且初始化所有内容为零值。
其次,make 返回类型本身,而 new 返回的是类型的引用指针。
再则,new 不常用,一般使用 := 代替。而 make 函数无法替代,因为 slice、map与channel都需要它来声明。
2837

被折叠的 条评论
为什么被折叠?



