【问题标题】:GO explicit array initializationGO 显式数组初始化
【发布时间】: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


    【解决方案1】:

    它们是等价的。一般: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}
    

    Spec: Variable declaration:

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

    所以你可以使用以下任何一种,都声明并初始化一个[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。您可以在枚举中的值之前包含一个可选索引,以指定其值所在的元素。

    Spec: Composite literals:

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

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

    由于您的初始数组包含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

    【讨论】:

    • 如果我想用 -1 初始化一个 int 数组怎么办?在不知道数组大小的情况下。像 _indexes := [numStacks]int{-1}
    • @eranotzap 那怎么样?如果numStacks 是一个大于0 的常数,那将起作用。如果要将所有元素初始化为 -1,请参阅 Is there analog of memset in go?
    • 甚至在解决初始化问题之前。 _indexes := [numStacks]int 给了我这个错误。非常量数组绑定 numStacks go
    • @eranotzap 请阅读我之前的评论:如果numstacks 是一个常量... 数组大小必须是常量。如果您在编译时不知道,请使用切片而不是数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2018-12-24
    • 2023-03-23
    相关资源
    最近更新 更多