new和make的区别和联系

207 阅读2分钟

内置函数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用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。