Go 创建数组的数组的复合文字
我想在结构中创建数组数组的复合文字。结构外部Go 创建数组的数组的复合文字,go,Go,我想在结构中创建数组数组的复合文字。结构外部 package main import "fmt" func main() { x := [...][]string {{"a", "b"}} fmt.Printf("%s", x) } 工作。() 但是我不能在结构中定义类型为[…][]字符串的字段。如 f给出了数组文本之外的[…]数组的错误用法问题是[…]elementType不是有效的类型名。您可以将该语法与初始化器语法一起使用,如[…]int{1,2,3,4},因为编译器可以查
package main
import "fmt"
func main() {
x := [...][]string {{"a", "b"}}
fmt.Printf("%s", x)
}
工作。()
但是我不能在结构中定义类型为[…][]字符串的字段。如
f给出了数组文本之外的[…]数组的错误用法问题是
[…]elementType
不是有效的类型名。您可以将该语法与初始化器语法一起使用,如[…]int{1,2,3,4}
,因为编译器可以查看有多少元素来确定实际类型(在本例中为[4]int
)
如果希望类似数组的类型没有固定的编译时大小,请使用切片:
type t struct {
f [][]string
}
或者,如果在编译时元素的数量是固定的,并且您仍然希望使用数组,则需要在类型定义中指定实际的元素计数。简短回答: 符号
[…]
可用于构造数组文字,但不能用于数组声明。在您提供的示例中,使用[…]
符号来声明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
属于不同的类型(查找它)。由于这些类型不同,将a
分配给b
(或反之亦然)是非法的,并且会导致编译错误:不能在分配中使用b(type[4]int)作为type[3]int
[…]
表示法:[…]
只能用作文本的一部分,它指示编译器应该从文本本身推断数组的长度。这就免除了程序员计算数组中元素数量的负担。但是,仍然可以在文本中指定一个大小,前提是该文本中包含相同数量或更少的元素(在这种情况下,结果数组中的其余元素为空)。例如,a:=[4]int{1,2}
是合法的,将创建此数组:[12 0]
变量声明中不能使用[…]
符号,因此此语句无效:var x[…]int
。类似地,在示例的结构的类型定义中,此语句是非法的:f[…][]string
,并要求您指定数组的大小。当然,它会给出一个错误!Go中的数组具有编译时固定长度。出于礼貌,编译器将为您计算数组文字的元素;这就是…
。没有文字、没有计数、没有…
,只需声明数组大小或使用切片即可。看一看。请:不要将一个切片称为数组,反之亦然(因为每次有人这样做时,一只小猫就死了)。这只是一个语法错误,加上对Go的数组和切片的误解。您完成了Go tour?这里可能会向您展示一些不可取的模式,但一旦您使用了切片,您就可以选择如何编写文本:
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))
}