据我所知,“...”表示下面代码段中数组的长度。

var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }

另一方面,正如我猜想的那样,“...”表示将片段y解压缩为以下代码段中int的参数。我对此不太确定。
x := []int{1,2,3}
y := []int{4,5,6}
x = append(x, y...)

现在,两种含义的差异使我很难理解“...”是什么。

最佳答案

您已经在Go中注意到了...的两种情况。实际上,有3个:

[...]int{1,2,3}

在编译时将评估为[3] int {1,2,3}
a := make([]int, 500)
SomeVariadicFunc(a...)

解压缩a作为函数的参数。这与您错过的一个(可变参数的定义)匹配:
func SomeVariadicFunc(a ...int)

现在是另一个问题(来自OP的评论)-为什么在所有这些情况下...都能在语义上起作用?答案是在英语(和其他语言)中,这被称为ellipsis。从那篇文章



在数组的情况下,这与“省略单词,句子或整个部分”的定义匹配。您将省略数组的大小,并让编译器为您解决。

在可变参数情况下,其含义相同,但含义不同。它还暗示着“未完成的思想”。我们经常用“...”来表示“等等”。 “我要买面包,鸡蛋,牛奶...”在这种情况下,“...”表示“其他与面包,鸡蛋和牛奶相似的东西”。在append中的使用表示“此列表的一个元素,以及所有其他元素”。这也许是不太直接的直观用法,但是对于母语为母语的人来说,这是有道理的。也许更“语言纯净”的结构本来应该是a[0]...甚至a[0], a[1], a[2]...,但这将导致空片(与...语法一起使用)的明显问题,更不用说冗长了。

通常,“...”用于表示“许多事物”,因此这两种用法都有意义。许多数组元素,许多 slice 元素(尽管一个是创建,而另一个是调用)。

我想隐藏的问题是“这是好的语言设计吗?”一方面,一旦您了解了语法,对于大多数以英语为母语的人来说,它就非常有意义,因此在某种意义上说它是成功的。另一方面,以这种方式不重载符号也很有值(value)。我可能会选择其他符号来进行数组拆包,但是我不能责怪他们使用对语言设计人员来说可能很直观的符号。特别是因为阵列版本甚至不经常使用。

如前所述,这对于编译器没有问题,因为情况永远不会重叠。您永远不能让[...]也意味着“解压缩”,因此没有符号冲突。

(此外:Go中还有另一种用法,我省略了,因为它不是语言本身,而是构建工具。键入go test ./...之类的意思是“测试此程序包,以及该程序包的所有子目录中的程序包。”但是应该我对其他用途的解释非常清楚,为什么在这里有意义。)

关于go - 三个点是否包含多种含义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24340379/

10-10 04:15