Golang Go语言中 make 与 new 的区别是什么?

发布于 1周前 作者 eggper 来自 Go语言

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

14 回复

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,通道,其他类型是不能用的。

请去看一遍官方的 effective go

看起来像是 c++的 new 和 malloc 的区别……

神经病式的面试官喜欢问这问题。
实际没啥区别,都是申请内存、初始化,无非作用对象不同

非要说区别的话,make 可以多加俩参数
:狗头:

曾被面试官问到过。你可以理解为:make 用来初始化 Go 的内部数据结构,new 用来创建一个指向返回类型的指针。或者参考这里: https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/

请去看一遍官方的 effective go

在Go语言中,makenew 都是用于内存分配的内置函数,但它们之间有着显著的区别,主要体现在它们所分配的内存类型和适用的对象上。

  1. new 函数

    • new(T) 会为类型 T 分配零值内存,并返回一个指向该内存的指针,类型为 *T
    • 它仅分配内存,并设置零值,但不初始化内存。适用于值类型(如基本数据类型、结构体等)。
    • 例如,new(int) 会分配一个 int 类型的零值(0)内存,并返回一个指向该 int 的指针。
  2. make 函数

    • make 主要用于分配和初始化引用类型的数据结构,如切片(slices)、映射(maps)和通道(channels)。
    • 它不仅分配内存,还进行初始化操作。例如,对于切片,make 会设置长度和容量;对于映射和通道,会进行必要的底层结构初始化。
    • 例如,make([]int, 5, 10) 会分配一个长度为5、容量为10的整型切片。

总结来说,new 用于分配任意类型的内存,并返回指向零值内存的指针;而 make 专门用于分配和初始化切片、映射和通道等引用类型的数据结构。在实际编程中,根据所需的数据类型和初始化需求选择合适的函数。

回到顶部