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、func、interface、map或slice类型的变量;在go语言中,没有初始化变量时,变量会有一个默认零值,注意此时还未初始化!所以,所以这个零值是没有类型的!nil不能直接进行赋值操作 因此,slice,map,channel必须得用make申请空间,make除了能在对上申请空间,还能初始化变量的默认零值(让零值有类型);这一点new不能办到。
以上是关于go语言学习笔记——new和make的区别的主要内容,如果未能解决你的问题,请参考以下文章