如今我正在学习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表现得像这样,有什么特别的原因吗?
答案 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