三个点(称为通配符?)是否包含多个含义?

时间:2014-06-21 09:48:34

标签: go

我承认," ..."表示下面代码段中数组的长度。

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...)

现在,这两个含义的差异使我很难理解" ..."是。
任何帮助都会很感激。

1 个答案:

答案 0 :(得分:28)

你在Go中注意到两个...个案例。事实上,有3个:

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

在编译时评估 到[3] int {1,2,3}

a := make([]int, 500)
SomeVariadicFunc(a...)

解包a作为函数的参数。这与您错过的那个匹配,即可变定义:

func SomeVariadicFunc(a ...int)

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

  

省略号(复数椭圆;来自古希腊语:ἔλλειψις,   élleipsis,“omission”或“fall short”)是一系列的点   通常表示故意遗漏某个词,句子或   文本的整个部分,而不改变其原始含义。1   根据它们的上下文和句子中的位置,省略号可以   也表明一个未完成的想法,一个主要声明,一个轻微的   停顿,紧张或尴尬的沉默。

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

在可变的情况下,它使用相同的含义,但不同。它也有“未完成的思想”的暗示。我们经常使用“......”来表示“依此类推”。 “我要买面包,鸡蛋,牛奶......”在这种情况下,“......”表示“其他类似于面包,鸡蛋和牛奶的东西”。例如,append中的用法表示“此列表的元素以及所有其他元素”。这可能是不那么直观的用法,但对于母语人士来说,这是有道理的。也许更“语言纯粹”的构造可能是a[0]...甚至是a[0], a[1], a[2]...,但这会导致空切片出现明显的问题(使用...语法),更不用说是冗长。

一般来说,“...”用于表示“很多东西”,这样两种用途都有意义。许多数组元素,许多切片元素(虽然一个是创建,另一个是调用)。

我认为隐藏的问题是“这是一种优秀的语言设计吗?”一方面,一旦你知道了语法,它对于大多数英语母语人士来说都是完全合理的,所以从这个意义上说它是成功的。另一方面,以这种方式不重载符号是有价值的。我可能会为数组解包选择一个不同的符号,但我不能因为使用对语言设计者来说可能直观的符号而对它们造成错误。特别是因为阵列版本甚至不经常使用。

如上所述,这对编译器来说没有问题,因为案例永远不会重叠。你永远不能让[...]也意味着“解包这个”,所以没有符号冲突。


(旁白:Go中省略了它的另一个用途,因为它不是语言本身,而是构建工具。键入类似go test ./...的东西意味着“测试这个包,以及子目录中的所有包这个“但是我应该很清楚地解释其他用途,为什么它在这里有意义。”