i give the all information to create composite literal
這就是事情:你沒有給所有需要的信息來創建一個複合字面。查看Spec: Composite literals部分了解需要什麼。
這字面:
{1, 2, 3, 4, 5}
這字面射門類型信息。它可能是[]int{}
文字的一部分,它可能是[]float32{}
文字的一部分,它甚至可能是結構文字的一部分,其中結構類型具有int
字段(例如type Ints struct{a,b,c,d,e int}
)。
是的,在這個變量聲明
var ilist [] int = {1, 2, 3, 4, 5} //error
只有[]int{}
字面是有道理的,但就是不走的工作原理。僅僅因爲只有一種類型可以使此行有效,並不意味着您可以忽略它。
注意,不過你可以省略從聲明的類型,如果它可以從初始化表達式來推斷,那麼這兩種形式都是有效的:
var ilist1 []int = []int{1, 2, 3, 4, 5}
var ilist2 = []int{1, 2, 3, 4, 5}
但{1, 2, 3, 4, 5}
類型是不明確的(如果這將是有效的)。
另外請注意,如果你指定一個複合字面的類型像[][]int
,你可以從(子)元素的文字省略類型,因爲它是由複合字面的類型已知的,所以這也是有效的:
var iilist = [][]int{
{1, 2, 3},
{4, 5, 6},
}
同去的地圖文字,這是有效的(在Go 1.5加入):
var imap = map[int][]int{
1: {1, 2, 3},
2: {4, 5, 6},
}
嘗試這些在Go Playground。
的討論我沒有Go的經驗,但我快速瀏覽了語言規範。你試過'var ilist [] int = [] int {1,2,3}'?像片段一樣的複合文字需要一個類型,與基本文字(如數字或字符串)相反。您也可以省略var name後面的類型:'var ilist = [] int {1,2,3}'。 – JayK
是的,你是正確的,但仍然很奇怪,因爲我給所有信息在聲明的左側(var ilist [] int)創建複合文字。 – iyasar