Golang Go语言中 make 与 new 关键词的区别
网上有相当的的文章讲述,但是还是不太理解,可以通俗的讲下之间的区别吗
Golang Go语言中 make 与 new 关键词的区别
之前看到的一篇文章,讲的挺好的:[面向信仰编程_make 和 new]( https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/),最开头应该算 OP 要的通俗解释吧。
更多关于Golang Go语言中 make 与 new 关键词的区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
一句话:make 只能用于 map 、slice 、channel ,new 只能用于结构体。
make 是 new 的扩展,仅支持 map 、slice 和 channel 。
#3 不对,它没有扩展 new ,,,😓
make 关键字的作用是创建切片、哈希表和 Channel 等内置的数据结构,而 new 的作用是为类型申请一片内存空间
我是不是可以这样理解
所谓的 make 初始化就是給已经申请内存空间,一个特定的数据结构。
new 与 make 相比,缺少了所谓的初始化的过程。
你的意思是对用的数据类型不一致
一句话概括:
new: 在调用时编译器知道你需要使用多少内存, 例如结构体, 整形或浮点型.
make: 在调用时编译器不知道你需要使用多少内存, 例如 slice, channel, map … 这些数据结构占用的内存是运行时才能知晓的
new 只能用于结构体 new 不止可以用于结构体, 任何是指针的都可以 用 new<br> m := make(map[int]int)<br> m[1] = 1<br> a := new(map[int]int)<br> a = &m<br><br> fmt.Println(*a)<br>
这段代码是没问题的
可以是可以,但我觉得这类似 JavaScript 的隐性类型转换,有具体规则,但实际使用中提倡不要去研究这些细节,直接采用最佳实践。
对普通的使用者来说只要知道一个是返回引用类型,一个是返回值类型的变量就可以了,要想更深入了解就看代码这两个方法是咋实现的呗。反正我目前还没有要看底层实现的需求。
1 make 用于创建内置复合类型(map, slice, channel),new 用于创建其他基础类型数据或用户自定义数据。
2 复合类型数据结构通常是一个结构体+堆内存,因此 make 的额外作用就是初始化这些数据(和指针)。从这一点看,make 的作用是申请内存,并且初始化数据。而 new 只负责申请内存,不初始化。
3 为什么 new 不会初始化,因为没有类似构造函数的概率。
4 虽然 make 是内置函数,但它并不是一个函数。golang 编译器在编译时,会根据 make 的参数类型选择相对应的运行时函数。例如 make(map[int]int), 那么就会将 make 替换成 new_map 之类的函数。
总结一下,make 用于创建内置复合类型数据,new 用于创建其他数据。
谢谢诸位,我理解理解
高手
make 只能用于 map 、slice 、channel ,new 只能用于结构体。
make: 给 slice map channel 分配内存空间,返回这个值.注意这些类型是引用类型变量
new: 常用来初始化自己定义的结构体,创建对象,返回新建对象的引用
另外 make([]string,0,5) 可以指定 slice 的长度,容量,
一开始就能估算出容量可以减少后续一次次扩容的开销
make(chan,1) 可以创建有缓冲区的 channel
make 返回引用对象
new 返回指针对象
new 、make
**new()**
函数用于为任何类型对象开辟内存空间的功能,其会将新开辟的内存空间设置为零值,然后返回这块内存区域的指针。
**make()**
函数仅用于 slice 、map 和 channel 类型的初始化使用,其会先开辟内存空间,然后再进行数据结构的必要的初始化(例如设置 cap 、size 等),最后返回初始化好的实例对象本身。
相关官方文档:
- new:[https://go.dev/doc/effective_go#allocation_new]( https://go.dev/doc/effective_go#allocation_new)
- make:[https://go.dev/doc/effective_go#allocation_make]( https://go.dev/doc/effective_go#allocation_make)
<br>- make 作用于 slice 、map 、channel ,返回值是这些类型的实例<br>- new 作用于 array 、struct 等值类型,返回值是分配的地址的指针<br>
在Go语言中,make
和 new
是两个用于内存分配的关键字,但它们有不同的用途和行为。
new
是一个内建函数,用于分配内存。它接受一个类型参数,返回一个指向该类型零值的指针。使用new
时,只会分配内存,并不会对内存进行初始化(除了将内存置为零)。例如,new(int)
会分配一个整数的零值(0)的内存,并返回一个指向该整数的指针(*int
)。
make
则是专门用于分配和初始化引用类型的数据结构,如切片(slices)、映射(maps)和通道(channels)。make
不仅分配了内存,还初始化了内部的数据结构,使其可以被直接使用。例如,make([]int, 10)
会创建一个长度为10、容量为10的整数切片,并返回这个切片([]int
)。这个切片可以直接被用来存储和访问元素。
总结来说,new
用于分配任意类型的内存,并返回一个指向该内存的指针,但不会对内存进行初始化(除了置零)。而make
则专门用于分配和初始化引用类型的数据结构,如切片、映射和通道,返回一个可以直接使用的数据结构。
因此,在选择使用new
还是make
时,应根据所需的数据类型和初始化的需求来决定。对于基本类型或结构体,使用new
;对于切片、映射和通道,则使用make
。