【问题标题】:Create array of array literal in Golang在 Golang 中创建数组文字数组
【发布时间】:2016-01-12 01:06:47
【问题描述】:

如何在 Golang 中使用切片文字创建一个 int 数组?

我试过了

test := [][]int{[1,2,3],[1,2,3]}

type Test struct {
   foo [][]int
}

bar := Test{foo: [[1,2,3], [1,2,3]]}

【问题讨论】:

  • 值得重申的是,您正在尝试创建切片,而不是数组。要创建一个数组,您可以使用 [N]type{42, 33, 567}[...]type{42, 33, 567} — 从初始化程序中的成员数推断出大小。
  • ^当然,我猜在 Go 中你很少使用数组,而且语法非常相似,我基本上将两者互换,即使它们是不同的东西。
  • 我不会说我很少使用它们。在解析某些网络协议的代码中,习惯上先声明一个数组,然后对其进行多次重新切片——将这些切片(作为某种窗口)传递给底层数组,传递给其他函数。在任何一种情况下,a) 我认为您的头脑中可能有错误的模型需要修复;-) b) 最好不要混淆读者,因为它们稍后会偶然发现您的帖子。

标签: go


【解决方案1】:

只需用大括号替换方括号即可。在 Go 中,数组字面量用花括号标识。

test := [][]int{{1,2,3},{1,2,3}}

【讨论】:

    【解决方案2】:

    你几乎得到了正确的东西,但是你的内部数组的语法有点偏离,需要花括号,比如; test := [][]int{[]int{1,2,3},[]int{1,2,3}} 或更简洁的版本; test := [][]int{{1,2,3},{1,2,3}}

    该表达式称为“复合文字”,您可以在此处阅读有关它们的更多信息; https://golang.org/ref/spec#Composite_literals

    但作为一个基本的经验法则,如果你有嵌套结构,你必须递归地使用语法。非常冗长。

    【讨论】:

    • 您不必对内部数组使用相同的语法:play.golang.org/p/Wdhabb3qca
    • @twotwotwo true,这在技术上是不同的,并且是 imo 首选。
    • 很高兴您添加了较短的示例,但答案仍然是“您必须递归地使用语法。它非常冗长”和“您必须对内部数组使用相同的语法”,其中当您考虑到内部切片可以以不同且更短的方式写出时,这似乎令人困惑或不准确。
    • @twotwotwo 好吧,我已经更改了措辞。我认为这是吹毛求疵。这是相同的语法,它们都被称为“复合文字”,只是在内部集合的情况下,可以推断出类型信息,但使用 []{} 确实是重要的区别。
    【解决方案3】:

    在其他一些语言(Perl、Python、JavaScript)中,[1,2,3] 可能是一个数组字面量,但在 Go 中,composite literals 使用大括号,在这里,您必须指定外部切片的类型:

    package main
    
    import "fmt"
    
    type T struct{ foo [][]int }
    
    func main() {
        a := [][]int{{1, 2, 3}, {4, 5, 6}}
        b := T{foo: [][]int{{1, 2, 3}, {4, 5, 6}}}
        fmt.Println(a, b)
    }
    

    你可以run or play with that on the Playground

    Go 编译器非常棘手,可以在没有你对每个元素这么说的情况下找出 [][]int 的元素是 []int。不过,您必须写出外部类型的名称。

    【讨论】:

      【解决方案4】:

      切片文字写为[]type{<value 1>, <value 2>, ... }。一个整数切片是[]int{1,2,3},一个整数切片是[][]int{[]int{1,2,3},[]int{4,5,6}}

      groups := [][]int{[]int{1,2,3},[]int{4,5,6}}
      
      for _, group := range groups {
          sum := 0
          for _, num := range group {
              sum += num
          }
          fmt.Printf("The array %+v has a sum of %d\n", sub, sum)
      } 
      

      【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 2019-11-22
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2016-02-28
      相关资源
      最近更新 更多