创建数组的数组的复合字面量

3

我希望能够创建一个包含数组的结构体的复合文字。在结构体外部。

package main

import "fmt"

func main() {
  x := [...][]string {{"a", "b"}}

  fmt.Printf("%s", x)
}

这段代码可以正常工作。 (http://play.golang.org/p/C2RbNnd7LL)

但是我不能在结构体中定义一个类型为[...][]string的字段,就像 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出现错误,使用了[...]数组,但没有在数组字面量中使用


当然会出错!Go中的数组具有编译时固定的长度。作为一种礼貌,编译器将为您计算数组字面量的元素数量;那就是...。没有字面量,没有计数,没有...,只需声明数组大小或使用切片。请查看http://blog.golang.org/slices。并且请注意:不要将切片称为数组,反之亦然(因为每次有人这样做,一只小猫就会死)。这只是一个语法错误,加上对Go数组和切片的误解。你完成了Go之旅吗? - Volker
这里可能会展示一些不可取的模式,但是一旦你使用了切片,你就有一些编写字面量的选项:http://play.golang.org/p/X1Pwsp0nK2 - twotwotwo
2个回答

2
问题在于 [...]elementType 不是一个有效的类型名称。你可以使用初始化语法如 [...]int{1, 2, 3, 4},因为编译器可以看到有多少元素来确定实际类型(在这种情况下为 [4]int)。如果您想要一个类似数组的类型,但没有固定的编译时大小,请使用切片:
type t struct {
    f    [][]string
}

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


1

简短回答:

符号[...]可以用于构建数组文字,但不能在数组声明中使用。在您提供的示例中,[...]符号用于声明结构元素。因此出现错误。请将[...]替换为[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打印到控制台,并说明此程序中的ab是不同类型的(在这里在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 是非法的,需要指定数组大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接