1. Go语言中的值类型和引用类型
- 值类型:int,float,bool,string,struct和数组 (数组要特别注意,别搞混了)
变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。
- 引用类型:slice,map,chan和值类型对应的指针
变量存储的是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址。内存通常在堆上分配,通过GC回收。
2.make()
make是用于内存分配,但是和new不同,它只用于slice、map和channel的内存创建,它返回的类型就是类型本身,而不是它们的指针类型。
3.new()
该方法的参数要求传入一个类型,而不是一个值,它会申请一个该类型大小的内存空间,并会初始化为对应的零值,返回指向该内存空间的一个指针。如下:
// 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
因此,我们可以稍稍修改上面错误的程序。对于引用类型的变量,我们不仅要声明变量(这仅仅是给变量取个名字),更重要的是,我们得手动为它分配空间!
var p *int // 引用类型,或者写成 p := new(int)
p = new(int)
*p = 10
fmt.Println(*p) // 10