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表现得像这样,有什么特别的原因吗?
我提供所有信息来创建复合文字
事情就是这样:你没有提供创建复合文字所需的全部信息.查看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尝试这些.
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |