i give the all information to create composite literal
这就是事情:你没有给所有需要的信息来创建一个复合字面。查看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{}
字面是有道理的,但就是不走的工作原理。仅仅因为只有一种类型可以使此行有效,并不意味着您可以忽略它。
注意,不过你可以省略从声明的类型,如果它可以从初始化表达式来推断,那么这两种形式都是有效的:
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。
的讨论我没有Go的经验,但我快速浏览了语言规范。你试过'var ilist [] int = [] int {1,2,3}'?像片段一样的复合文字需要一个类型,与基本文字(如数字或字符串)相反。您也可以省略var name后面的类型:'var ilist = [] int {1,2,3}'。 – JayK
是的,你是正确的,但仍然很奇怪,因为我给所有信息在声明的左侧(var ilist [] int)创建复合文字。 – iyasar