GO 显式数组初始化
Posted
技术标签:
【中文标题】GO 显式数组初始化【英文标题】:GO explicit array initialization 【发布时间】:2016-12-11 12:23:54 【问题描述】:在 GO 中是否有显式的数组初始化(声明和赋值)或者唯一的方法是使用速记运算符? 这是一个实际示例 - 这两个是否相等:
a := [3]int1, 0, 1
var a [3]int = [3]int1, 0, 1
【问题讨论】:
【参考方案1】:它们是等价的。一般:Spec: Short variable declaration:
短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
它是带有初始化表达式但没有类型的常规 variable declaration 的简写:
"var" IdentifierList = ExpressionList .
所以这一行:
a := [3]int369, 0, 963
相当于这个:
var a = [3]int369, 0, 963
但是由于表达式列表是[3]int
类型的composite literal,所以下面是一样的:
var a [3]int = [3]int369, 0, 963
Spec: Variable declaration:
如果存在类型,则为每个变量指定该类型。否则,每个变量都被赋予赋值中对应的初始化值的类型。
所以你可以使用以下任何一种,都声明并初始化一个[3]int
类型的变量:
a := [3]int369, 0, 963
b := [...]int369, 0, 963
var c = [3]int369, 0, 963
var d [3]int = [3]int369, 0, 963
var e [3]int = [...]int369, 0, 963
var f = [...]int369, 0, 963
注意事项:
请注意,在复合文字中,不列出所有值是有效的。未明确指定值的元素将是元素类型的zero value。您可以在枚举中的值之前包含一个可选索引,以指定其值所在的元素。
Spec: Composite literals:
对于数组和切片字面量,以下规则适用:
每个元素都有一个关联的整数索引,用于标记其在数组中的位置。 具有键的元素使用该键作为其索引;键必须是常量整数表达式。 没有键的元素使用前一个元素的索引加一。如果第一个元素没有键,则其索引为零。
由于您的初始数组包含0
,它是元素类型int
的零值,您可以将其从文字中排除。要创建变量并将其初始化为值[3]int369, 0, 963
,您也可以这样做:
// Value at index 1 implicitly gets 0:
g := [3]int369, 2: 963
h := [...]int369, 2: 963
尝试Go Playground 上的所有示例。
更多细节+实际例子请看这个问题:Keyed items in golang array initialization
【讨论】:
如果我想用 -1 初始化一个 int 数组怎么办?在不知道数组大小的情况下。像 _indexes := [numStacks]int-1 @eranotzap 那怎么样?如果numStacks
是一个大于0
的常数,那将起作用。如果要将所有元素初始化为 -1
,请参阅 Is there analog of memset in go?
甚至在解决初始化问题之前。 _indexes := [numStacks]int 给了我这个错误。非常量数组绑定 numStacks go
@eranotzap 请阅读我之前的评论:如果numstacks
是一个常量... 数组大小必须是常量。如果您在编译时不知道,请使用切片而不是数组。以上是关于GO 显式数组初始化的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )