创建数组数组的复合文字

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


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 给出了数组文字之外 [...] 数组的错误使用


一只甜甜圈
浏览 196回答 2
2回答

蝴蝶刀刀

问题是这[...]elementType不是有效的类型名称。您可以将语法与初始化语法一起使用,[...]int{1, 2, 3, 4}因为编译器可以看到有多少元素来确定实际类型([4]int在这种情况下)。如果您想要一个没有固定编译时间大小的类数组类型,请使用切片:type t struct {    f    [][]string}或者,如果元素的数量在编译时是固定的,而您仍想使用数组,则需要在类型定义中指定实际的元素数。

明月笑刀无情

简短的回答:该符号[...]可用于构造数组文字,但不能用于数组声明。在您提供的示例中,该[...]符号用于声明结构元素。因此错误。替换[...]为[n],其中 n 是数组的实际大小。长答案:与许多其他编程语言不同,Go 将数组的长度作为类型信息的一部分。因此,Go 中没有类型只是一个数组,但它始终是一个特定大小的数组。例如,在下面的代码中,有两个int数组,一个是type,一个是[3]inttype [4]int,由于它们的类型不同,将一个赋值给另一个是非法的。package mainimport (    "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到控制台并说明它a和b在这个程序中是不同的类型(在 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,并要求您指定数组的大小。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go