Golang Go语言中 make 与 new 的区别是什么?
Golang Go语言中 make 与 new 的区别是什么?
我理解的是:
- new 会初始化值类型(如果 int,string,struct ),并返回指向该类型值的指针
- ( make/slice/chan )使用 make,make 返回的是类型本身,引用类型没必要返回他们的指针
但是网上经常出现这样的解释:
- new 是用来分配内存的内建函数, 但与其它语言中的同名函数不同,它不会“初始化内存”,只会将“内存置零"
- make 只用于创建切片、映射和信道,并返回类型为 T (而非 *T )的一个已初始化 (而非置零)的值
我不明白,初始化内存,内存置零有什么区别,内存都置零了,难道还没有初始化内存吗
更多关于Golang Go语言中 make 与 new 的区别是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
new 就只是内存分配了,make 就是再做个初始化之类的
更多关于Golang Go语言中 make 与 new 的区别是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
初始化我理解就是执行了构造函数了
举个例子,slice 要存 length 和 capacity,这些都可以不为零,所以不能用 new。具体 Effective Go 里有讲。
new 只是&T{}的一个语法糖
new
会申请内存并全部清 0
*make
会申请内存并初始化该类型
像make([]int, 10, 100)
这种情况就必须要用make
初始化,因为需要初始化length
,capacity
<br>var p *[]int = new([]int) // allocates slice structure; *p == nil; rarely useful<br>var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints<br>
new 新建任意类型的指针。
make 只能用于切片,map,通道,其他类型是不能用的。
看起来像是 c++的 new 和 malloc 的区别……
神经病式的面试官喜欢问这问题。
实际没啥区别,都是申请内存、初始化,无非作用对象不同
曾被面试官问到过。你可以理解为:make 用来初始化 Go 的内部数据结构,new 用来创建一个指向返回类型的指针。或者参考这里: https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/
请去看一遍官方的 effective go
在Go语言中,make
和 new
都是用于内存分配的内置函数,但它们之间有着显著的区别,主要体现在它们所分配的内存类型和适用的对象上。
-
new
函数:new(T)
会为类型T
分配零值内存,并返回一个指向该内存的指针,类型为*T
。- 它仅分配内存,并设置零值,但不初始化内存。适用于值类型(如基本数据类型、结构体等)。
- 例如,
new(int)
会分配一个int
类型的零值(0)内存,并返回一个指向该int
的指针。
-
make
函数:make
主要用于分配和初始化引用类型的数据结构,如切片(slices)、映射(maps)和通道(channels)。- 它不仅分配内存,还进行初始化操作。例如,对于切片,
make
会设置长度和容量;对于映射和通道,会进行必要的底层结构初始化。 - 例如,
make([]int, 5, 10)
会分配一个长度为5、容量为10的整型切片。
总结来说,new
用于分配任意类型的内存,并返回指向零值内存的指针;而 make
专门用于分配和初始化切片、映射和通道等引用类型的数据结构。在实际编程中,根据所需的数据类型和初始化需求选择合适的函数。