在Golang中,关于"..."运算符的困惑

10
以下两种语法在Go中有什么区别?
x := [...]int{ 1:1, 2:2 }
x := []int{ 1:1, 2:2 }

Go语言的文档中指出:"符号...表示数组长度等于最大元素下标加1"。但是以上两种语法都给出了相同的长度(3)。
这个操作符"..."有一个名称吗?我在谷歌上没找到搜索该操作符的方法。

1
你可能想要通过 tour.golang.org 来逐步学习。 - Volker
1个回答

16
第一行使用数组字面量创建了一个 数组,其长度由编译器自动计算。该方法在语言规范的Composite literals部分详细介绍。

符号“...”指定了数组的长度,等于最大元素索引加1。

注意:这不应与用于指定 可变参数 或将切片作为值传递的“...”混淆。该方法在规范的Function types部分详细介绍。

第二行使用切片字面量,并将生成一个 切片。请注意,在幕后也会创建一个数组,但这是不可见的。

1
我有一个疑问。第一个创建了一个数组[0, 1, 2],而第二个创建了一个引用数组[0, 1, 2]的切片(长度=容量=3)。这两者有什么区别? - IhtkaS
切片是一种动态数组,而数组的大小是固定的。 - Elwinar
1
@Spartan 首先,它们是两种不同的类型。如果你想了解数组和切片的用处/用法,请阅读Effective Go:ArraysSlices,或者博客文章Go Slices: usage and internalsArrays, Slices (and strings): The mechanics of 'append' - icza
2
@Spartan 补充一下区别:数组是 _值_,切片是 _引用_。我们鼓励传递切片(因为它们只是引用),它们指向同一个底层数组。需要小心地将数组作为值传递,因为这会传递数组的副本。数组在规划内存的详细布局和有时可以帮助避免分配方面很有用,但主要是切片的构建块。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接