new and make
在 Go 语言中, new 和 make 方法,其主要用途都是用于分配相应类型的内存空间。简单的说,new只分配内存,make用于slice,map,和channel的初始化。
方法签名
func make(t Type, size …IntegerType) Type
func new(Type) *Type
make
在 Go 语言中,内置函数 make 仅支持 slice、map、channel 三种数据类型的内存创建,其返回值是所创建类型的本身,而不是新的指针引用。
slice map channel 本身就是引用类型
1 | func main() { |
调用
make函数去初始化切片(slice)的类型时,会带有零值
new
在 Go 语言中,内置函数 new 可以对类型进行内存创建和初始化。其返回值是所创建类型的指针引用,与 make 函数在实质细节上存在区别。
1 | type T struct { |
区别
new 返回指针,make 返回引用类型
new 没有参数,make 需要指定类型
make 返回初始化后可以直接使用的对象,new 返回还需要初始化的指针
make 只用于 slice、map、channel 等内置引用类型,new 可用于任意类型
综合上面的分析,使用 new 和 make 的一些原则:
- new 用于值类型和用户定义的类型,如数组、结构体
- make 用于内置引用类型,如切片、map、channel
一个简单的区分记忆法则是:
- new 给类型本身分配内存
- make 从类型生成对象
日常使用中,对内置引用类型要优先考虑使用 make 进行初始化。
new() 和 make() 的底层实现原理
new() 的底层实现原理
new()函数在底层使用了 Go 的runtime.newobject函数。runtime.newobject函数会分配一块内存,大小为指定类型的大小,并将该内存清零。- 然后,
runtime.newobject函数会返回这块内存的指针。
make() 的底层实现原理
make()函数在底层使用了 Go 的runtime.makeslice、runtime.makemap和runtime.makechan函数。runtime.makeslice函数用于创建切片,它会分配一块连续的内存空间,并返回切片结构体。runtime.makemap函数用于创建映射,它会分配一块哈希表内存,并返回映射结构体。runtime.makechan函数用于创建通道,它会分配一块通道内存,并返回通道结构体。
参考连接
Go : new 和 make 是什么,差异在哪?大家好,我是煎鱼。 在 Go 语言中,有两个比较雷同的内置函数,分别是 - 掘金