【问题标题】:Confusion with "..." operator in golang与 golang 中的“...”运算符混淆
【发布时间】:2015-02-24 09:42:46
【问题描述】:

go中以下两种语法有什么区别?

x := [...]int{ 1:1, 2:2 }
x := []int{ 1:1, 2:2 }

Go 的文档说“符号 ... 指定数组长度等于最大元素索引加一”。但是上述两种语法都给出了相同的长度 (3)。

这个操作符“...”有名字吗? 没有找到在 google 中搜索此运算符的方法。

【问题讨论】:

  • 你可能想通过 tour.golang.org 工作。

标签: arrays go operators slice


【解决方案1】:

第一行使用一个数组字面量创建一个array,它的长度由编译器自动计算。语言规范的Composite literals 部分对此进行了详细说明。

符号 ... 指定数组长度等于最大元素索引加一。

注意:不要与... 混淆,该... 用于指定可变参数 参数或将切片作为其值传递。它在规范的Function types 部分中有详细说明。

第二行使用一个切片文字,结果是slice。请注意,在后台也会创建一个数组,但这是不透明的。

【讨论】:

  • 我有一个疑问。第一个创建一个数组 [0, 1, 2],第二个创建一个引用数组 [0, 1, 2] 的切片(长度 = 容量 = 3)。这两个有什么区别
  • 切片是一种动态数组,而数组的大小是固定的。
  • @Spartan 好吧,首先,它们是两种不同的类型。如果您询问数组和切片的有用性/用法,请阅读 Effective Go:ArraysSlices,或博客文章 Go Slices: usage and internalsArrays, Slices (and strings): The mechanics of 'append'
  • @Spartan 补充差异:数组是,切片是引用。鼓励您传递切片(因为它们只是引用)并且它们引用相同的底层数组。数组应该作为值传递时要小心,因为这会传递数组的副本。数组在规划内存的详细布局时很有用,有时可以帮助避免分配,但主要是它们是切片的构建块。
猜你喜欢
  • 2018-04-01
  • 1970-01-01
  • 2019-12-29
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多