据我所知,“ …”表示下面代码段中数组的长度。
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
另一方面y,正如我猜想的那样,“ …”表示将以下代码段中的切片拆分为int的参数。我对此不太确定。
y
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作为函数的参数。这与您错过的一个(可变参数的定义)相匹配:
a
func SomeVariadicFunc(a ...int)
现在是另一个问题(摘自OP的评论)- 为什么…在所有这些情况下都可以在语义上起作用? 答案是在英语(和其他语言)中,这被称为省略号。从那篇文章
省略号(复数椭圆;来自古希腊语:ἔλλειψις,élleipsis,“省略”或“落空”)是一系列点,通常表示故意从文本中省略了单词,句子或整个部分,而没有改变其原文含义。1 根据其上下文和在句子中的位置,省略号也可能表示未完成的思想,领先的陈述,稍稍的停顿以及紧张或尴尬的沉默。
在数组的情况下,这与“省略单词,句子或整个部分”的定义匹配。您将省略数组的大小,而让编译器为您解决。
在可变参数情况下,它使用相同的含义,但使用不同的含义。它还暗示着“未完成的思想”。我们经常用“ …”来表示“等等”。“我要买面包,鸡蛋,牛奶…”在这种情况下,“ …”表示“其他与面包,鸡蛋和牛奶相似的东西”。在中的使用append表示“此列表的一个元素,以及所有其他元素”。这也许不是那么直接的直观用法,但是对于母语为母语的人来说,这是有道理的。也许已经a[0]...或什至会出现“语言纯净”的构造,a[0], a[1], a[2]...但这会导致空片(与...语法一起使用)带来明显的问题,更不用说冗长了。
append
a[0]...
a[0], a[1], a[2]...
通常,“ …”用于表示“许多事物”,因此这两种用法都有意义。许多数组元素,许多切片元素(尽管一个是创建,而另一个是调用)。
我想隐藏的问题是“这是好的语言设计吗?” 一方面,一旦您了解了语法,对于大多数以英语为母语的人来说,它就非常有意义,因此在某种意义上说它是成功的。另一方面,以这种方式不重载符号也很有价值。我可能会选择其他符号来进行数组拆包,但我不能因为使用了语言设计人员可能直观的符号而对它们提出了质疑。特别是因为阵列版本甚至不经常使用。
如前所述,这对于编译器没有问题,因为情况永远不会重叠。您永远[...]也不会表示“解压缩”,因此没有符号冲突。
[...]
(此外:Go中还有另一种用法,我省略了,因为它不是语言本身,而是构建工具。键入类似的内容go test ./...表示“测试此程序包,以及该程序包的所有子目录中的所有程序包。”但是应该我对其他用途的解释非常清楚,为什么在这里有意义。)
go test ./...