使用var关键字初始化切片

iya*_*sar 1 initialization literals go slice

现在我正在学习Golang并且不了解Golang的行为方式.

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

ilist := []int{1, 2, 3}  //it works
Run Code Online (Sandbox Code Playgroud)

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

var ilist [] int = {1, 2, 3, 4, 5}  //error
Run Code Online (Sandbox Code Playgroud)

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

var i int = 5 // works fine
Run Code Online (Sandbox Code Playgroud)

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

icz*_*cza 5

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

事情就是这样:你没有提供创建复合文字所需的全部信息.查看Spec:Composite literals部分以查看所需内容.

这个文字:

{1, 2, 3, 4, 5}
Run Code Online (Sandbox Code Playgroud)

这个字面错过了类型信息.它可以是[]int{}文字的一部分,它可以是文字的一部分[]float32{},它甚至可以是结构文字的一部分,其中结构类型具有int字段(例如type Ints struct{a,b,c,d,e int}).

是的,在这个变量声明中

var ilist [] int = {1, 2, 3, 4, 5}  //error
Run Code Online (Sandbox Code Playgroud)

只有[]int{}文字才有意义,但这不是Go的工作方式.仅仅因为只有一种类型可以使这一行有效,这并不意味着你可以省略它.

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

var ilist1 []int = []int{1, 2, 3, 4, 5}

var ilist2 = []int{1, 2, 3, 4, 5}
Run Code Online (Sandbox Code Playgroud)

但是这种类型{1, 2, 3, 4, 5}是模糊的(如果它是有效的).

另请注意,如果要为类型类型指定复合文字[][]int,则可以省略元素的(子)文字中的类型,因为它可以从复合文字的类型中获知,因此这也是有效的:

var iilist = [][]int{
    {1, 2, 3},
    {4, 5, 6},
}
Run Code Online (Sandbox Code Playgroud)

地图文字也是如此,这是有效的(在Go 1.5中添加):

var imap = map[int][]int{
    1: {1, 2, 3},
    2: {4, 5, 6},
}
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试这些.