2017-05-29 80 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