我认识到,"..."表示下面代码段中数组的长度.
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
Run Code Online (Sandbox Code Playgroud)
另一方面,"..."意味着将切片解压缩y到下面代码片段中的int参数,我猜.我对此并不十分肯定.
x := []int{1,2,3}
y := []int{4,5,6}
x = append(x, y...)
Run Code Online (Sandbox Code Playgroud)
现在,这两个含义的差异使我很难理解"......"是什么.
任何帮助将是欣赏.
Lin*_*ope 29
你已经注意到两个...Go的案例.实际上,有3个:
[...]int{1,2,3}
Run Code Online (Sandbox Code Playgroud)
在编译时评估为[3] int {1,2,3}
a := make([]int, 500)
SomeVariadicFunc(a...)
Run Code Online (Sandbox Code Playgroud)
解包a作为函数的参数.这匹配你错过的那个,可变参数定义:
func SomeVariadicFunc(a ...int)
Run Code Online (Sandbox Code Playgroud)
现在进一步的问题(来自对OP的评论) - 为什么......在所有这些情况下都可以在语义上工作?答案是在英语(和其他语言)中,这被称为省略号.从那篇文章
省略号(复数椭圆;来自古希腊语:ἔλλειψις,élleipsis,"省略"或"落空")是一系列点,通常表示故意忽略文本中的单词,句子或整个部分而不改变其原始含义.1 根据其上下文和句子中的位置,省略号也可以表示未完成的思想,主要陈述,轻微的停顿以及紧张或尴尬的沉默.
在数组的情况下,这匹配"省略单词,句子或整个部分"的定义.你省略了数组的大小,让编译器为你解决问题.
在变量情形中,它使用相同的含义,但不同.它也有"未完成的思想"的暗示.我们经常使用"......"来表示"依此类推"."我要买面包,鸡蛋,牛奶......"在这种情况下,"......"表示"其他类似于面包,鸡蛋和牛奶的东西".例如,用于append表示"此列表的元素以及所有其他元素".这可能是不那么直观的用法,但对于母语人士来说,这是有道理的.也许一个更"语言纯粹"的结构可能已经a[0]...或者甚至a[0], a[1], a[2]...但是这会导致空切片的明显问题(这与...语法一起工作),更不用说是冗长的.
一般来说,"..."用于表示"很多东西",并且通过这种方式,它的两种用途都是有意义的.许多数组元素,许多切片元素(虽然一个是创建,另一个是调用).
我想隐藏的问题是"这是一个很好的语言设计吗?" 一方面,一旦你知道了语法,它对于大多数英语母语人士来说都是完全合理的,所以从这个意义上说它是成功的.另一方面,以这种方式不重载符号是有价值的.我可能会为数组解包选择一个不同的符号,但我不能因为使用对语言设计者来说可能直观的符号而对它们造成错误.特别是因为阵列版本甚至不经常使用.
如前所述,这对编译器来说没有问题,因为案例永远不会重叠.你永远不可能[...]也意味着"解包这个",所以没有符号冲突.
(旁白:在Go中省略了它的另一种用法,因为它不是语言本身,而是构建工具.键入类似的东西go test ./..."测试这个包,以及这个包的子目录中的所有包".但它应该是非常清楚我对其他用途的解释,为什么它在这里有意义.)