【发布时间】:2016-12-11 12:23:54
【问题描述】:
在 GO 中是否有显式的数组初始化(声明和赋值)或者唯一的方法是使用速记运算符? 这是一个实际示例 - 这两个是否相等:
a := [3]int{1, 0, 1}
var a [3]int = [3]int{1, 0, 1}
【问题讨论】:
标签: arrays go initialization variable-assignment declaration
在 GO 中是否有显式的数组初始化(声明和赋值)或者唯一的方法是使用速记运算符? 这是一个实际示例 - 这两个是否相等:
a := [3]int{1, 0, 1}
var a [3]int = [3]int{1, 0, 1}
【问题讨论】:
标签: arrays go initialization variable-assignment declaration
它们是等价的。一般:Spec: Short variable declaration:
短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .它是带有初始化表达式但没有类型的常规 variable declaration 的简写:
"var" IdentifierList = ExpressionList .
所以这一行:
a := [3]int{369, 0, 963}
相当于这个:
var a = [3]int{369, 0, 963}
但是由于表达式列表是[3]int类型的composite literal,所以下面是一样的:
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}
注意事项:
请注意,在复合文字中,不列出所有值是有效的。未明确指定值的元素将是元素类型的zero value。您可以在枚举中的值之前包含一个可选索引,以指定其值所在的元素。
对于数组和切片字面量,以下规则适用:
- 每个元素都有一个关联的整数索引,用于标记其在数组中的位置。
- 具有键的元素使用该键作为其索引;键必须是常量整数表达式。
- 没有键的元素使用前一个元素的索引加一。如果第一个元素没有键,则其索引为零。
由于您的初始数组包含0,它是元素类型int 的零值,您可以将其从文字中排除。要创建变量并将其初始化为值[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 上的所有示例。
更多细节+实际例子请看这个问题:Keyed items in golang array initialization
【讨论】:
numStacks 是一个大于0 的常数,那将起作用。如果要将所有元素初始化为 -1,请参阅 Is there analog of memset in go?
numstacks 是一个常量... 数组大小必须是常量。如果您在编译时不知道,请使用切片而不是数组。