创建数组数组的复合文字

时间:2014-11-24 23:59:07

标签: go

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

package main

import "fmt"

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

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

的工作原理。 (http://play.golang.org/p/C2RbNnd7LL

但我无法在结构中定义[...] []字符串的字段。与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在数组文字

之外使用[...]数组的错误

2 个答案:

答案 0 :(得分:2)

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

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

type t struct {
    f    [][]string
}

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

答案 1 :(得分:1)

简答:

符号[...]可用于构造数组文字,但不能在数组声明中使用。在您提供的示例中,[...]表示法用于声明struct元素。因此错误。将[...]替换为[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,并且要求您指定数组的大小。