1、new
var a *int
*a=10
fmt.Println(*a)
输出结果:
panic: runtime error: invalid memory address or nil pointer dereference
以上代码引发panic的原因是:var a *int 只是声明了一个指针变量a,但并没有进行初始化。指针是引用类型,需要初始化后才能分配内存空间,才能给它赋值
使用new()分配内存
new(Type) *Type
Type表示类型,new函数只接受一个参数,这个参数是一个类型
*Type表示指针类型,new函数返回一个指向该类型内存地址的指针
var a *int
a = new(int) //分配内存
*a=10
fmt.Println(*a)
2、make
也用于分配内存,但只用于slice、map和channel的内存创建,返回的类型就是三个类型本身,因为这三种类型本来就是引用类型,没必要返回他们的指针了
var b map[string]int //声明一个map类型变量b
b = make(map[string]int, 10) //为b分配内存空间
b["age"] = 12 //为b添加键值
fmt.Println(b)
3、new和make的区别
- 都是用来做内存分配的
- make只用于slice、map、channel的初始化,因为三者原本就是引用类型,返回的就是各自引用类型本身
- new用于对值类型的指针内存分配,内存对应的默认值是对应值类型的零值,返回的是指针类型
b := 99 //int类型b
var a *int //定义一个*int类型的指针a
a = new(int) //为指针a分配内存
*a = b //将b的值放入指针a指向的内存
fmt.Println(&a) //取出指针a的地址值,0x1400000e028
fmt.Println(*a) //取出指针a指向的值,99