内置函数new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。
引用类型必须使用make函数创建,编译器会将make转化为目标类型专用的创建函数(或指令),以确保完成全部内存分配和相关属性初始化。
除new/make函数外,也可使用初始化表达式,编译器生成的指令基本相同
new是一个内置的函数,它的函数签名:
func new(Type) *Type
其中:
1.Type表示类型,new函数只接受一个参数,这个参数是一个类型
2.*Type表示类型指针,new函数返回一个指向该类型内存地址的指针
make函数的函数签名如下:
func make(t Type, size ...IntegerType) Type
当然,new函数也可为引用类型分配内存,但这是不完整创建,以map为例,它仅分配了字典类型本身(实际上就是一个指针包装)所需内存,并没有分配键值存储内存,也没有初始化散列桶等内部属性,因此它无法正常工作
func main() {
p := new(map[string]int) //函数new返回指针
m := *p
m["a"] = 1
fmt.Println(m)
}
var a *int
只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。应该按照如下方式使用内置的new函数对a进行初始化之后就可以正常对其赋值了:
func main() {
var a *int
a = new(int)
*a = 10
fmt.Println(*a)
}
总结:
1.二者都是用来做内存分配的。
2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
作者:啤酒味的大白兔
链接:https://juejin.cn/post/7216266083097919525
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。