2017-05-29 78 views
1

現在我正在學習Golang,並且不瞭解Golang的行爲方式。使用var關鍵字初始化切片

這是手短的一個切片的聲明和初始化:

ilist := []int{1, 2, 3} //it works 

,另一方面,如果我嘗試申報,並與var關鍵字初始化它,它給出了一個錯誤:

var ilist [] int = {1, 2, 3, 4, 5} //error 

如果我只是初始化的變量(不是切片),它工作正常:

var i int = 5 // works fine 

Golang爲什麼表現得這樣,有沒有什麼特別的原因?

+3

的討論我沒有Go的經驗,但我快速瀏覽了語言規範。你試過'var ilist [] int = [] int {1,2,3}'?像片段一樣的複合文字需要一個類型,與基本文字(如數字或字符串)相反。您也可以省略var name後面的類型:'var ilist = [] int {1,2,3}'。 – JayK

+0

是的,你是正確的,但仍然很奇怪,因爲我給所有信息在聲明的左側(var ilist [] int)創建複合文字。 – iyasar

回答

5

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

0

In go,different names mean different types。所以當你定義一個變量時,你必須指定它的類型。這意味着,你需要確保你的任務是一個具體的類型。 「{}」可以多於一種類型,因此編譯器無法找到ilist類型。順便說一句,有些朋友提出了一個關於Proposal: Alias declarations for Go