GO显式数组初始化

6
在GO中是否有显式的数组初始化(声明和赋值)方式,或者唯一的方法是使用简写运算符? 这里有一个实际的例子 - 这两个是否相等:
a := [3]int{1, 0, 1}

var a [3]int = [3]int{1, 0, 1}
1个回答

11

它们是等价的。一般而言:规范:短变量声明:

短变量声明 使用如下语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

这是一种使用初始化表达式而没有类型的常规变量声明的简写方式:

"var" IdentifierList = ExpressionList .

所以这一行:

a := [3]int{369, 0, 963}

相当于这个:

var a = [3]int{369, 0, 963}

但由于表达式列表是类型为[3]int复合字面量,所以下面的代码等价:

var a [3]int = [3]int{369, 0, 963}

规范:变量声明:

如果指定了类型,则每个变量都被赋予该类型。否则,每个变量都被赋予相应初始化值在赋值中的类型。

因此您可以使用以下任何一种方式,全部声明并初始化类型为[3]int的变量:

a := [3]int{369, 0, 963}
b := [...]int{369, 0, 963}
var c = [3]int{369, 0, 963}
var d [3]int = [3]int{369, 0, 963}
var e [3]int = [...]int{369, 0, 963}
var f = [...]int{369, 0, 963}

注意:

在复合字面量中,不列出所有值是有效的。未显式指定值的元素将成为该元素类型的零值。您可以在值枚举中在值之前包括可选索引,以指定其值将是哪个元素的值。

规范: 复合字面量:

对于数组和切片字面量,应用以下规则:

  • 每个元素都有一个关联的整数索引来标记其在数组中的位置。
  • 具有键的元素使用该键作为其索引;键必须是常量整数表达式。
  • 没有键的元素使用上一个元素的索引加一。如果第一个元素没有键,则其索引为零。

由于您的初始数组包含了元素类型int的零值 0,因此您可以将其从字面量中排除。要创建并初始化一个变量为值[3]int{369, 0, 963},您也可以这样做:

// Value at index 1 implicitly gets 0:
g := [3]int{369, 2: 963} 
h := [...]int{369, 2: 963} 

请在Go Playground上尝试所有示例。

有关更多详细信息和实用示例,请参见此问题:Golang数组初始化中的键控项


如果我想用-1初始化一个int数组,而不知道数组的大小怎么办? 类似这样 _indexes:= [numStacks] int {-1} - eran otzap
如果 numStacks 是一个大于 0 的常量,那么这将有效。如果你想让所有元素初始化为 -1,请参见 Is there analog of memset in go? - icza
在着手解决初始化问题之前,需要注意好这个问题。_indexes := [numStacks]int 会导致错误,因为 numStacks 不是常量数组边界。 - eran otzap
1
@eranotzap 请阅读我的先前评论:如果 numstacks 是一个常量... 数组大小必须是常量。如果你在编译时不知道它,请使用切片代替数组。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接