昨天刷到了一道题,这道题是关于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函数分配内存。
就像上面所示,指针存储的是指向某一块内存的地址,而引用就是类型它本身。指针可以指向不同内存地址,但引用就只能固定在该类型的某一块内存里。