我想在结构中创建一个数组数组的复合文字。在结构之外
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在数组文字
之外使用[...]数组的错误答案 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
打印到控制台,并说明此程序中的a
和b
属于不同类型(找到它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
,并且要求您指定数组的大小。