昨天刷到了一道题,这道题是关于make和new函数的区别。make和new都是go的内建(built-in)函数,作用都是用来给类型T分配内存的:

var ptr *int			// 虽然定义了一个变量,但它的值不指向任何内存地址
ptr = new(int)
var foo map[string]int
foo = make(map[string]int)

// a   := "A"											foo := make([]int,0)
// ptr := &a 											 
//  ----------------------         -------------         ---------------------------
// |0x010D("ptr")| 0x00FF |-----> |0x00FF | "A" |		|0x0100("foo")| nil | 0 | 0 |
//  ----------------------         -------------         ---------------------------
// 其实new和make的根本区别就是指针和引用的区别,指针可以指向不同内存地址,而引用就是在内存中代表了该类型

第一行定义了一个指针变量。
第二行使用new函数分配内存并返回指针,然后赋值给指针变量ptr。此时ptr的值指向刚分配的内存
第三行定义了引用类型为map的变量。
第四行使用make函数分配内存。

new和make在内存中的差异
就像上面所示,指针存储的是指向某一块内存的地址,而引用就是类型它本身。指针可以指向不同内存地址,但引用就只能固定在该类型的某一块内存里。