【问题标题】:Creating composite literal of array of arrays创建数组数组的复合文字
【发布时间】:2014-11-24 23:59:07
【问题描述】:

我想在结构中创建数组数组的复合文字。在结构之外

package main

import "fmt"

func main() {
  x := [...][]string {{"a", "b"}}

  fmt.Printf("%s", x)
}

有效。 (http://play.golang.org/p/C2RbNnd7LL)

但我无法在结构中定义 [...][]string 类型的字段。如http://play.golang.org/p/wHNeeuAJuO

package main

import "fmt"

type t struct {
    f    [...][]string
}

func main() {
  x := [...][]string {{"a", "b"}}
  y := t{x}
  fmt.Printf("%s", y)
}

f 给出了在数组字面量之外使用 [...] 数组的错误

【问题讨论】:

  • 当然会报错! Go 中的数组具有编译时固定长度。出于礼貌,编译器将为您计算数组 literal 的元素;那是...。没有文字,没有计数,没有...,只需说明数组大小或使用切片。看看blog.golang.org/slices。并且请:不要将切片称为数组,反之亦然(因为每次有人做一只小猫都会死)。这只是一个语法错误加上对 Go 的数组和切片的误解。你完成了围棋之旅?
  • 可能会在这里向您展示一些不可取的模式,但是一旦您确实使用切片,您就可以选择如何编写文字:play.golang.org/p/X1Pwsp0nK2

标签: go


【解决方案1】:

问题在于[...]elementType 不是有效的类型名称。您可以将语法与 [...]int{1, 2, 3, 4} 之类的初始化器语法一起使用,因为编译器可以查看有多少元素来确定实际类型(在本例中为 [4]int)。

如果您想要一个没有固定编译时间大小的类数组类型,请使用切片:

type t struct {
    f    [][]string
}

或者,如果元素的数量在编译时是固定的,而您仍想使用数组,则需要在类型定义中指定实际的元素数量。

【讨论】:

    【解决方案2】:

    简答:

    符号[...] 可用于构造数组字面量,但不能用于数组声明。在您提供的示例中,[...] 表示法用于声明结构元素。因此错误。将[...] 替换为[n],其中n 是数组的实际大小。

    长答案:

    与许多其他编程语言不同,Go 将数组的长度作为类型信息的一部分。因此,Go 中没有任何类型只是一个数组,但它始终是一个特定大小的数组。比如下面的代码,有两个int数组,一个是[3]int类型,一个是[4]int类型,由于它们的类型不同,一个赋值给另一个是非法的。

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        a := [...]int{1, 2, 3}
        b := [...]int{1, 2, 3, 4}
        fmt.Println(reflect.TypeOf(a), reflect.TypeOf(b))
    }
    

    此程序将[3]int [4]int 打印到控制台,并说明此程序中的ab 属于不同类型(找到它here on the Go Playground)。由于这些是不同的类型,将a 分配给b(反之亦然)是非法的,并导致编译错误:cannot use b (type [4]int) as type [3]int in assignment

    [...] 表示法:[...] 只能用作文字的一部分,它表示编译器应该从文字本身推断数组的长度。这免除了程序员计算数组中元素数量的负担。然而,人们仍然可以在字面量中指定一个大小,只要字面量中的元素数量相同或更少(在这种情况下,结果数组中的剩余元素为空)。例如a := [4]int{1,2} 是合法的,将创建这个数组:[1 2 0 0]

    [...] 表示法不能用于变量声明,因此该语句无效:var x [...]int。同样,在您的示例结构的类型定义中,此语句是非法的:f [...][]string,并要求您指定数组的大小。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2016-01-12
      • 2016-08-30
      • 2019-06-04
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多