Go 使用var关键字初始化切片
现在我正在学习Golang,不了解Golang的行为 这里是一个切片的简写声明和初始化: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 戈朗为什么会这样,有什么具体原因吗 我给出了创建复合文字的
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},
}