【问题标题】:What's the difference between make([]int, 0), []int{}, and *new([]int)?make([]int, 0)、[]int{} 和 *new([]int) 有什么区别?
【发布时间】:2017-03-14 19:55:46
【问题描述】:

根据https://play.golang.org/p/7RPExbwOEU,它们都打印相同并且具有相同的长度和容量。三种初始化切片的方式有区别吗?有首选方法吗?我发现自己使用 make([]int, 0)[]int{} 的频率相同。

【问题讨论】:

标签: go slice


【解决方案1】:

这会初始化一个长度为 0 的切片。

make([]int, 0)

使用make 是初始化具有不同于长度的特定容量的切片的唯一方法。这分配了一个长度为 0,但容量为 1024 的切片。

make([]int, 0, 1024)

这是一个切片文字,它也初始化一个长度为 0 的切片。使用这个或make([]int, 0) 是唯一的偏好。

[]int{}

这会初始化一个指向切片的指针,该切片会立即被取消引用。 slice 本身还没有初始化,仍然是 nil,所以这基本上什么都不做,相当于[]int(nil)

*new([]int)

【讨论】:

  • 最后一点不对。根据规范:“内置函数 new 采用类型 T,在运行时为该类型的变量分配存储空间,并返回指向它的 *T 类型的值。变量的初始化如上一节中所述初始值。”所以 *new([]int) 应该等价于 []int{}。
  • @Adrian: new 无法初始化切片。切片的零值是 nil,因此您会得到一个指向 nil 切片的初始化指针。 play.golang.org/p/lVL9Tkxk_D
  • 啊,公平点。有时很容易混淆切片和数组的机制。
猜你喜欢
  • 2019-08-14
  • 2017-10-17
  • 1970-01-01
  • 2018-02-25
  • 2014-06-07
  • 2019-11-06
  • 2019-06-22
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多