多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # new 这是一个用来分配内存的内建函数,但是与C++不一样的是,**它并不初始化内存,只是将其置零**。也就是说,new(T)会为T类型的新项目,分配被置零的存储,并且**返回它的地址**,一个类型为\*T的值。在Go的术语中,其返回一个指向新分配的类型为T的指针,这个指针指向的内容的值为零(zero value)。注意并不是指针为零。 Go语言中的对象没有C++中的构造函数,如果用C来描述,Go中的new大概相当于: > T \*t = (T\*)malloc(sizeof(T)) > > memset(t, 0, sizeof(T)) 其实,上面的描可能也不是很准确,也许用\*t=zerovalue更准确。因为对于不同的数据类型,零值的意义是完全不一样的。比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串 # make 内建函数make(T, args)与new(T)的用途不一样。它**只用来创建slice,map和channel**,并且**返回一个初始化的(而不是置零),类型为T的值(而不是\*T)**。之所以有所不同,**是因为这三个类型的背后引用了使用前必须初始化的数据结构**。例如,slice是一个三元描述符,包含一个指向数据(在数组中)的指针,长度,以及容量,在这些项被初始化之前,slice都是nil的。对于slice,map和channel,make初始化这些内部数据结构,并准备好可用的值 记住make只用于map,slice和channel,并且不返回指针。 要获得一个显式的指针,使用new进行分配,或者显式地使用一个变量的地址