2 回答
TA贡献1801条经验 获得超8个赞
问题是这[...]elementType不是有效的类型名称。您可以将语法与初始化语法一起使用,[...]int{1, 2, 3, 4}因为编译器可以看到有多少元素来确定实际类型([4]int在这种情况下)。
如果您想要一个没有固定编译时间大小的类数组类型,请使用切片:
type t struct {
f [][]string
}
或者,如果元素的数量在编译时是固定的,而您仍想使用数组,则需要在类型定义中指定实际的元素数。
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,并要求您指定数组的大小。
- 2 回答
- 0 关注
- 195 浏览
添加回答
举报