Go 使用var关键字初始化切片

Go 使用var关键字初始化切片,go,initialization,slice,literals,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,不了解Golang的行为

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

ilist := []int{1, 2, 3}  //it works
另一方面,如果我试图用
var
关键字声明并初始化它,它会给出一个错误:

var ilist [] int = {1, 2, 3, 4, 5}  //error
如果我只初始化一个变量(而不是一个切片),它可以正常工作:

var i int = 5 // works fine
戈朗为什么会这样,有什么具体原因吗

我给出了创建复合文字的所有信息

问题是:您没有提供创建复合文字所需的所有信息。查看该部分以了解所需内容

此文字:

{1, 2, 3, 4, 5}
此文字将丢失类型信息。它可以是
[]int{}
文本的一部分,也可以是
[]float32{}
文本的一部分,甚至可以是结构文本的一部分,其中结构类型具有
int
字段(例如
类型Ints结构{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},
}
映射文字也是如此,这是有效的(已添加到):


试试这些。在围棋中,不同的名字意味着不同的类型。因此,定义变量时,必须指定其类型。这意味着,你需要确保你的作业是具体类型的。“{}”可以是多个类型,因此编译器无法找到
ilist
类型。顺便说一句,一些朋友提出了一个关于

我对围棋没有经验,但我快速查看了语言规范。您是否尝试过
var-ilist[]int=[]int{1,2,3}
?与数字或字符串等基本文字不同,类似于切片的复合文字需要类型。您还可以省略变量名称后面的类型:
var-ilist=[]int{1,2,3}
。是的,您说得对,但仍然很奇怪,因为我在声明(var-ilist[]int)的左侧提供了创建复合文字的所有信息。
var imap = map[int][]int{
    1: {1, 2, 3},
    2: {4, 5, 6},
}