跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Go 中 make 与 new 的区别是什么?
未分類
29 4 月 2020

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

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

資深大佬 : w708833018 50

我理解的是:
– new 会初始化值类型(如果 int,string,struct ),并返回指向该类型值的指针
– ( make/slice/chan )使用 make,make 返回的是类型本身,引用类型没必要返回他们的指针

但是网上经常出现这样的解释:
– new 是用来分配内存的内建函数, 但与其它语言中的同名函数不同,它不会“初始化内存”,只会将“内存置零”
– make 只用于创建切片、映射和信道,并返回类型为 T (而非 *T )的一个已初始化 (而非置零)的值

我不明白,初始化内存,内存置零有什么区别,内存都置零了,难道还没有初始化内存吗

大佬有話說 (13)

  • 資深大佬 : lhx2008

    new 就只是内存分配了,make 就是再做个初始化之类的

  • 資深大佬 : lhx2008

    初始化我理解就是执行了构造函数了

  • 資深大佬 : noO9LeRxXX

    举个例子,slice 要存 length 和 capacity,这些都可以不为零,所以不能用 new。具体 Effective Go 里有讲。

  • 資深大佬 : monsterxx03

    new 只是&T{}的一个语法糖

  • 資深大佬 : Cbdy

    基本没有区别

  • 資深大佬 : ChristopherWu

    * `new` 会申请内存并全部清 0
    * `make`会申请内存并初始化该类型

    像 `make([]int, 10, 100)` 这种情况就必须要用`make`初始化,因为需要初始化 `length`, `capacity`

    “`
    var p *[]int = new([]int) // allocates slice structure; *p == nil; rarely useful
    var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
    “`

  • 資深大佬 : Hellert

    new 新建任意类型的指针。
    make 只能用于切片,map,通道,其他类型是不能用的。

  • 資深大佬 : chitanda

    请去看一遍官方的 effective go

  • 資深大佬 : secondwtq

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

  • 資深大佬 : wweir

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

  • 資深大佬 : wweir

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

  • 資深大佬 : lazydog

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

  • 資深大佬 : Mithrandir

    请去看一遍官方的 effective go

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具