【问题标题】:Go: range and len of multidimensional array?Go:多维数组的范围和长度?
【发布时间】:2012-11-19 08:06:04
【问题描述】:

是否可以在多维数组上使用 range 和 len?

使用 var a [3]int8 或

package main

func main () {    
        var a [3][5]int8

        for h := range a {
                println(h)
        }
        println(len(a))
}

两者都生产 0 1 2 3 ?

感谢dystroy的回答,这是一个我能够适应的编写和读取3维数组的示例(在此处发布是因为我很难找到任何示例,所以也许这对其他人有帮助):

package main
func main() {
    var a [3][5][7]uint8

    //write values to array
    for x, b := range a {
        for y, c := range b {
            for z, _ := range c {
                    a[x][y][z] = uint8(x*100+y*10+z)
                }
        }   
    }

    //read values from array
    for _, h := range a {
        for _, i := range h {
            for _, j := range i {
                print(j, "\t")
            }
            println()
        }
        println()
    }

}

【问题讨论】:

    标签: arrays go range multidimensional-array


    【解决方案1】:

    在 Go 和大多数语言中一样,您所说的多维数组是数组的数组。 len 运算符只为您提供“外部”数组的长度。

    如果您将 var 声明视为

    ,可能对您来说更清楚
    var a [3]([5]int8)
    

    也可以编译。它是一个大小为 3 的数组,其元素是大小为 5 的 int8 数组。

    package main
    import "fmt"
    func main() {
        var a [3][5]int8
        for _, h := range a {
            fmt.Println(len(h)) // each one prints 5
        }
        fmt.Println(len(a))  // prints 3, the length of the external array
    }
    

    输出

    5
    5
    5
    3
    

    要安全地遍历整个矩阵,您可以这样做:

    for _, h := range a {
        for _, cell := range h {
            fmt.Print(cell, " ")
        }
        fmt.Println()
    }
    

    如果您需要更改内容,您可以这样做

        for i, cell := range h { // i is the index, cell the value
            h[i] = 2 * cell
        }
    

    【讨论】:

    • 如果/当数组的大小未知/不记得时,循环遍历多维数组内容的好方法是什么? 2 个基于 len(a)_,var:=range a 的循环?像_,_,var:=range a 中那样对 3 维(或更多)维数组使用范围缩放的方式吗?
    • 谢谢你的例子,我在任何地方都找不到。
    • 可以修改该循环以将值分配给数组元素吗?
    • 是的,使用for i, h := range a 构造并执行a[i]=something
    • 非常感谢,go 数组现在开始对我有意义了 :)
    【解决方案2】:

    已经提供了range的解决方案,下面我就讲讲如何在golang中使用length(len)遍历一个多维数组。

    所以如果你有一个数组arr[][]

    [1,2,3] [4,5,6]

    现在len(arr) 将输出 = 2。

    len(arr[1]) will output = 3

    此处提供示例代码:https://play.golang.org/p/XerzPhkQrhU

    【讨论】:

      【解决方案3】:

      不,第一个产生 0,1,2(范围内的索引)

      http://play.golang.org/p/0KrzTRWzKO

      第二个产生 3(数组的长度)。

      http://play.golang.org/p/0esKFqQZL0

      在这两种情况下,您都在使用最外层的数组。

      【讨论】:

      • 它是“使用 var a [3]int8 或 var a [3][5]int8”的简写。
      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多