您已经注意到两个案例...
在围棋中。其实有3种:
[...]int{1,2,3}
评估在编译时至 [3]int{1,2,3}
a := make([]int, 500)
SomeVariadicFunc(a...)
Unpacks a
作为函数的参数。这与您错过的可变参数定义相匹配:
func SomeVariadicFunc(a ...int)
现在进一步的问题(来自OP的评论)——为什么……在所有这些情况下都可以在语义上起作用?答案是,在英语(和其他语言)中,这被称为ellipsis http://en.wikipedia.org/wiki/Ellipsis。从那篇文章
省略号(复数省略号;源自古希腊语:ἔλλειψις,
élleipsis,“遗漏”或“未达标”)是一系列点,
通常表示故意省略单词、句子或
文本的整个部分而不改变其原始含义。1 http://en.wikipedia.org/wiki/Ellipsis根据其上下文和在句子中的位置,省略号可以
也表示未完成的想法、主要陈述、轻微的
停顿,以及紧张或尴尬的沉默。
在数组情况下,这与“省略单词、句子或整个部分”定义匹配。您忽略了数组的大小并让编译器为您计算出来。
在可变参数情况下,它使用相同的含义,但不同。它还带有“未完成的想法”的暗示。我们经常使用“...”来表示“等等”。 “我要去买面包、鸡蛋、牛奶……”在这种情况下,“……”表示“类似于面包、鸡蛋和牛奶的其他东西”。使用在,例如,append
意思是“这个列表中的一个元素,以及所有其他元素”。这也许是不太直观的用法,但对于母语人士来说,这是有道理的。也许更“语言纯粹”的结构是a[0]...
甚至a[0], a[1], a[2]...
但这会导致空切片出现明显的问题(这确实适用于...
语法),更不用说冗长了。
一般来说,“...”用来表示“许多事情”,这样它的两种用法都是有意义的。许多数组元素,许多切片元素(尽管一个是创建,另一个是调用)。
我想隐藏的问题是“这是好的语言设计吗?”一方面,一旦你了解了语法,它对于大多数以英语为母语的人来说都是完全有意义的,所以从这个意义上说它是成功的。另一方面,不以这种方式重载符号是有价值的。我可能会选择不同的符号来进行数组解包,但我不能责怪他们使用了语言设计者可能直观的符号。特别是因为数组版本甚至不经常使用。
如前所述,这对编译器来说不是问题,因为案例永远不会重叠。你永远不可能拥有[...]
也意味着“解压这个”,所以不存在符号冲突。
(旁白:我省略了 Go 中它的另一种用法,因为它不在语言本身中,而是在构建工具中。输入类似go test ./...
意思是“测试这个包,以及这个包的子目录中的所有包”。但通过我对其他用途的解释应该非常清楚为什么它在这里有意义。)