【问题标题】:Go: Arrays of arrays, arrays of slices, slices of arrays and slices of slicesGo:数组数组、切片数组、数组切片和切片切片
【发布时间】:2012-11-10 02:20:15
【问题描述】:

试图自学但发现很难找到示例,我的大脑已经陷入困境。非常不确定 3 和 4,需要帮助才能使 5 起作用。

package main
import "fmt"

func main () {
    println("0. Array:")
    var a = [...]int{4,5,6,7,8,9} //assign
    fmt.Println(a,"\n")

    println("1. Slice:")
    var as []int
    as = a[:] //assign
    fmt.Println(as,"\n")

    println("2. Array of arrays:")
    var b [4][len(a)]int
    for i:= range b { //assign
        b[i]=a
    }
    fmt.Println(b,"\n")

    println("3. Array of slices:")
    var d [len(b)][]int
    for i:= range b { // assign
        d[i] = b[i][:] //does this really work?
    }
    fmt.Println(d,"\n")

    println("4. Slice of arrays:")
    var c [][len(a)]int
    c = b[:][:] // assign, does this really work?
    fmt.Println(c,"\n")

    println("5. Slice of slices:")
    var e [][]int
//  e = c //  ???
    fmt.Println(e,"\n")
}

【问题讨论】:

    标签: arrays go multidimensional-array slice


    【解决方案1】:

    第 3 部分有效。

    第 4 部分包含一个不必要的 [:]

    println("4. Slice of arrays:")
    var c [][len(a)]int
    c = b[:]    // one [:], not two
    fmt.Println(c, "\n")
    

    b[:] 被评估为一个切片,其中每个元素都是一个[len(a)]int。如果您添加另一个[:],您将再次切片。因为对于任何 slice s,s[:] == s,它都是一个 no op。

    第 5 部分,您可以对切片数组进行切片。

    println("5. Slice of slices:")
    var e [][]int
    e = d[:]
    fmt.Println(e, "\n")
    

    我在http://play.golang.org/p/WDvJXFiAFe 发布了一个完整的示例。

    【讨论】:

      【解决方案2】:

      “这真的有效吗?”的答案取决于你的期望。考虑http://play.golang.org/p/7Z5hKioTI_的这个例子

      package main
      
      import "fmt"
      
      func main() {
          fmt.Println("0. Array:")
          var a = [...]int{4, 5, 6, 7, 8, 9}  //assign
          fmt.Println(a, "\n")
      
          fmt.Println("1. Slice:")
          var as []int
          as = a[:]   //assign
          fmt.Println(as, "\n")
      
          fmt.Println("new slice:")
          ns := make([]int, len(a))
          copy(ns, a[:])
          fmt.Print(ns, "\n\n")
      
          fmt.Println("modifying array...")
          a[0] = 10
          fmt.Print("array is now:\n", a, "\n\n")
          fmt.Print("slice is now:\n", as, "\n\n")
          fmt.Print("new slice is still:\n", ns, "\n")
      }
      

      它显示了切片如何具有底层数组,并且 OP 中的示例使用相同的底层数组制作切片。如果希望切片具有独立的内容,则必须制作新切片并复制数据。 (或者有附加的技巧......)

      另外作为一个附注,println 将数据发送到标准错误而不是标准输出,并且格式化某些数据类型与 fmt.Println 不同。为避免混淆,最好保持使用 fmt.Println 的习惯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-04
        • 2012-02-23
        • 1970-01-01
        • 2017-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多