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

Posted wtxuebc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不能办到。
    

以上是关于go语言学习笔记——new和make的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

Go语言中new和 make的区别详解

Go语言 make和new关键字的区别

Go make 和 new的区别

go语言中new与make的使用和区别

Go 中make和new有什么区别