使用var关键字初始化切片

时间:2017-05-29 11:06:58

标签: go initialization slice literals

如今我正在学习Golang并且不了解Golang的行为方式。

这是一个简单的声明和初始化:

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

另一方面,如果我尝试使用var关键字声明并初始化它,则会出错:

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

如果我只初始化一个变量(不是切片),它可以正常工作:

var i int = 5 // works fine

为什么Golang表现得像这样,有什么特别的原因吗?

2 个答案:

答案 0 :(得分:5)

  

我提供所有信息来创建复合文字

就是这样:你没有提供创建复合文字所需的全部信息。查看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{}字面值才有意义,但这不是Go的工作方式。仅仅因为只有一种类型可以使这一行有效,这并不意味着你可以省略它。

请注意,如果可以从初始化表达式中推断出,您可以省略声明中的类型,因此这两种形式都是有效的:

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上尝试这些。

答案 1 :(得分:0)

go,different names mean different types。因此,在定义变量时,必须指定其类型。这意味着,您需要确保您的作业是具体类型。 “{}”可以是多种类型,因此编译器找不到ilist类型。顺便说一下,有些朋友就Proposal: Alias declarations for Go

进行了讨论