2014-06-21 65 views
10

正如我所認識到的,「...」意味着下面代碼段中數組的長度。做三個點(叫做通配符?)包含多重含義嗎?

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

現在,在兩個含義的差異使得我很難明白什麼「......」是。
任何幫助將不勝感激。

+5

它確實意味着兩個不同的事情在Go - 「推斷這個數組的大小」或「解包這個切片到一個一套可變參數「。這是你的問題,還是你在問更多的英語「爲什麼可以用於這兩種情況並且語義正確?」 – LinearZoetrope

+0

謝謝你解密我的問題。我的問題是兩者(我現在知道)。我想確認「...」是否包含兩個含義是正確的。現在我明白你的答覆。現在我想知道後者「爲什麼可以用於這兩種情況並且語義正確?」 – Nigiri

+0

@Taichi Sato因爲兩個語法情況不重疊。編譯器總是能夠找出你的意思中的哪一個。 – fuz

回答

25

您已經注意到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,「不作爲」或「未能達到」)是一系列的點是 通常表示一個字的故意遺漏,句子,或 整段文字而不改變其原意。 1 根據句子的上下文和位置的不同,省略號可以表示未完成的想法,領先的陳述,輕微的暫停以及緊張或尷尬的沉默。

在數組的情況下,它匹配「省略單詞,句子或整節」定義。您正在省略數組的大小,並讓編譯器爲您解決問題。

在可變參數的情況下,它使用相同的含義,但具有不同的含義。它也有「未完成的想法」的暗示。我們經常使用「...」來表示「等等」。 「我要拿麪包,雞蛋,牛奶......」在這種情況下,「......」表示「其他類似麪包,雞蛋和牛奶的東西」。在例如append中的使用意味着「該列表中的一個元素,以及所有其他元素」。這可能不太直觀,但對於母語人士來說,這是有道理的。也許更「純粹的語言」的構造應該是a[0]...甚至a[0], a[1], a[2]...,但這會導致空片(與...語法一起工作)的明顯問題,更不用說是冗長的了。

一般而言,「...」用於表示「許多事物」,通過這種方式,它的兩種用法都是有意義的。許多數組元素,許多切片元素(儘管一個是創建,另一個是調用)。

我想隱藏的問題是「這是好的語言設計嗎?「一方面,一旦你知道語法,對於大多數母語爲英語的人來說,這是非常有意義的,所以在這個意義上說它是成功的。另一方面,這樣不會超載符號是有價值的,我可能會選擇一個不同的符號用於數組拆包,但我不能錯誤地使用符號,這對語言設計者來說可能是直觀的,尤其是因爲陣列版本甚至不經常被使用。 。問題的編譯器,因爲案件不能重疊,你永遠不能擁有[...]也意味着「解開這個」,所以沒有符號衝突


(旁白:還有另一種使用它在Go中我省略了,因爲它不在語言本身,而是構建工具。輸入類似go test ./...的意思是「測試此軟件包以及此子目錄中的所有軟件包」。但它應該很清楚,我的解釋其他用途爲什麼它在這裏有意義。)

+2

非常感謝你!特別是關於我真正想了解的可變情況。對於隱藏的問題和另一個「...」的用法,我現在很清楚。 – Nigiri