为了账号安全,请及时绑定邮箱和手机立即绑定

创建数组数组的复合文字

创建数组数组的复合文字

Go
一只甜甜圈 2021-08-30 22:24:14
我想在结构中创建数组数组的复合文字。在结构之外package mainimport "fmt"func main() {  x := [...][]string {{"a", "b"}}  fmt.Printf("%s", x)}作品。( http://play.golang.org/p/C2RbNnd7LL )但是我无法在结构中定义 [...][]string 类型的字段。如http://play.golang.org/p/wHNeeuAJuOpackage mainimport "fmt"type t struct {    f    [...][]string}func main() {  x := [...][]string {{"a", "b"}}  y := t{x}  fmt.Printf("%s", y)}f 给出了数组文字之外 [...] 数组的错误使用
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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


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


type t struct {

    f    [][]string

}

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


查看完整回答
反对 回复 2021-08-30
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

简短的回答:


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


长答案:


与许多其他编程语言不同,Go 将数组的长度作为类型信息的一部分。因此,Go 中没有类型只是一个数组,但它始终是一个特定大小的数组。例如,在下面的代码中,有两个int数组,一个是type,一个是[3]inttype [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在这个程序中是不同的类型(在 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,并要求您指定数组的大小。


查看完整回答
反对 回复 2021-08-30
  • 2 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信