go语言—new和make

文章详细解释了Go语言中new和make两个关键字在内存分配上的差异。new用于值类型的指针分配,返回的是指针且初始化为零值,而make则专门用于slice、map和channel的初始化,返回的是可以直接使用的引用类型实例。未初始化的指针会导致panic错误,如示例所示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值