在 Go 中,我可以使用长变量声明形式来声明整数和切片:
var i int
var s []int
int
和[]int
是类型。到目前为止,一切都很好。但是,如果我想初始化变量,我应该写:
var i int = 2
var s = []int{1, 2, 3}
不是
var s []int = {1, 2, 3}
为什么会出现这样的不一致?
规范中这样描述了变量声明:
如果给出了表达式列表,则使用遵循赋值语句规则的表达式来初始化变量。
如果存在类型,则每个变量都会被赋予该类型。否则,每个变量都会在赋值中被赋予相应初始化值的类型。
在声明中
var i int = 2
该类型存在且为
int
。表达式 2
存在并使用通常的赋值规则分配给变量。
声明中:
var s = []int{1, 2, 3}
类型不存在(
=
之前没有指定类型),因此变量被赋予初始化值的类型。复合文字表达式 []int{1, 2, 3}
的类型为 []int
。
声明
var s []int = {1, 2, 3}
声明了
[]int
类型的变量,但无法编译,因为 {1, 2, 3}
不是有效的表达式。
这里没有矛盾。问题是
{1, 2, 3}
不是一个表达式。