Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 创建数组的数组的复合文字_Go - Fatal编程技术网

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))
}