go语言学习笔记——new和make的区别

文章目录

​ go语言提供了两种内建函数new和make,用法不尽相同;内建函数:顾名思义,就是编译器内部实现的函数。这些函数跟关键字一样,可以直接使用,无须像标准库函数那样,要 #include 对应的头文件才能用。

new

谈到new,可以先看看C++里边new的三种用法

  • 关键字:new会做两步:1.先开辟空间。2.调用构造函数

    class *a = new class(1);
    //这里calss泛指某种类型,向下都是
    

    此时开辟的空间并非1,而和class的成员变量有关,若是int类型就是4字节(不考虑存在虚函数和虚继承)

    然后调用构造函数可以试想一下构造的两种方式有什么区别:

  • operator new:相当于malloc,只开辟空间

    class *a = (class*)oprator new(sizeof(class));
    
  • 定位new,在已经开辟好的空间上调用构造函数

    new(a) class(1);
    

然后再看go语言里边的new

首先,区别与其他语言中的new会初始化内存,go语言中的new只会将内存置零;

a := new(class) *class

就是说,go语言中,new(class) 会为类型为class的a分配置零的空间,然后返回*class (class类型的指针:该指针指向新分配的,类型为class的零值)

make

make也是一个内建函数,与new不一样的是它返回一个引用

func make(class, size class) class

值得一提的是,内建函数 make 只用来为 slice(切片,另一篇文章再细谈),map 或 chan 分配内存和初始化一个对象;

跟new相似,参数calss都是类型,但是多了一个size大小,返回的也是一个引用;

总结
  • make和new都是go语言用来分配内存的内建函数,且在堆上分配内存,make 分配并且初始化内存。new只是将内存清零,并没有初始化内存。

  • make返回的还是引用本身;而new返回的是指向类型的指针。

  • make只能用来分配及初始化类型为slice,map,channel的数据;

    new可以分配任意数据;

    注意:
      将空间置零和初始化是两个概念;
      注意nil的概念:nil只能赋值给指针、channel、funcinterfacemap或slice类型的变量;在go语言中,没有初始化变量时,变量会有一个默认零值,注意此时还未初始化!所以,所以这个零值是没有类型的!nil不能直接进行赋值操作
      因此,slice,map,channel必须得用make申请空间,make除了能在对上申请空间,还能初始化变量的默认零值(让零值有类型);这一点new不能办到。
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值