Go语言中的new和make一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。他们所做的事情,和应用的类型也不相同。二者都是用来分配空间。 Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 1。new new(T)为一个T类型新值分配空间并将此空间初始化为T的零值,返回的是新值的地址,也就是T类型的指针T,该指针指向T的新分配的零值。 new要点 内置函数new分配空间。 传递给new函数的是一个类型,不是一个值。 返回值是指向这个新分配的零值的指针。 2。make make(T,args)返回的是初始化之后的T类型的值,这个新值并不是T类型的零值,也不是指针T,是经过初始化之后的T的引用。make也是内建函数,您可以从http:golang。orgpkgbuiltinmake看到它,它的函数原型比new多了一个(长度)参数,返回值也不同。 make只能用于slice,map,channel三种类型,并且只能是这三种对象。和new一样,第一个参数是类型,不是一个值。但是make的返回值就是这个类型(即使一个引用类型),而不是指针。具体的返回值,依赖具体传入的类型。 3。总结 new(T)返回T的指针T并指向T的零值。 make(T)返回的初始化的T,只能用于slice,map,channel,要获得一个显式的指针,使用new进行分配,或者显式地使用一个变量的地址。 new函数分配内存,make函数初始化; 下图给出了区别: new和make区别代码: packagemain importfmt funcmain(){ p:new(〔〕int)withlenandcap0 fmt。Println(p) v:make(〔〕int,10,50)visinitialedwithlen10,cap50 fmt。Println(v) Output 〔〕 〔0000000000〕 (p)〔0〕18panic:runtimeerror:indexoutofrange becausepisanilpointer,withlenandcap0 v〔1〕18ok }