内容目录
本文基于Go 1.14.2
builtin/builtin.go // The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type
// The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type: // Slice: The size specifies the length. The capacity of the slice is // equal to its length. A second integer argument may be provided to // specify a different capacity; it must be no smaller than the // length. For example, make([]int, 0, 10) allocates an underlying array // of size 10 and returns a slice of length 0 and capacity 10 that is // backed by this underlying array. // Map: An empty map is allocated with enough space to hold the // specified number of elements. The size may be omitted, in which case // a small starting size is allocated. // Channel: The channel's buffer is initialized with the specified // buffer capacity. If zero, or the size is omitted, the channel is // unbuffered. func make(t Type, size ...IntegerType) Type
从源码描述可以得出
- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于
&T{}
。 - make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel
参考the way to go 7.2.4章节的图解
在图 7.3 的第一幅图中:
var p *[]int = new([]int) // *p == nil; with len and cap 0 p := new([]int)
在第二幅图中, p := make([]int, 0)
,切片 已经被初始化,但是指向一个空的数组(p!=nil)。
我们再通过测试代码验证上述结论
package main import "log" func main() { p := new([]int) log.Println(*p)//断点1 b := make([]int, 0) log.Println(b)//断点2 }
使用dlv 跟踪断点