new和make的区别和联系

内置函数new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。

引用类型必须使用make函数创建,编译器会将make转化为目标类型专用的创建函数(或指令),以确保完成全部内存分配和相关属性初始化。

除new/make函数外,也可使用初始化表达式,编译器生成的指令基本相同

new是一个内置的函数,它的函数签名:

func new(Type) *Type

其中:

1.Type表示类型,new函数只接受一个参数,这个参数是一个类型

2.*Type表示类型指针,new函数返回一个指向该类型内存地址的指针

make函数的函数签名如下:

func make(t Type, size ...IntegerType) Type

当然,new函数也可为引用类型分配内存,但这是不完整创建,以map为例,它仅分配了字典类型本身(实际上就是一个指针包装)所需内存,并没有分配键值存储内存,也没有初始化散列桶等内部属性,因此它无法正常工作

func main() {
    p := new(map[string]int) //函数new返回指针
    m := *p
    m["a"] = 1
    fmt.Println(m)
}

var a *int只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。应该按照如下方式使用内置的new函数对a进行初始化之后就可以正常对其赋值了:

func main() {
    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)
}

总结:

1.二者都是用来做内存分配的。

2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;

3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

作者:啤酒味的大白兔
链接:https://juejin.cn/post/7216266083097919525
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值