Go:range和len of multidimensional array?

kil*_*s76 11 arrays range go multidimensional-array

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

使用var a [3] int8或

package main

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

        for h := range a {
                println(h)
        }
        println(len(a))
}
Run Code Online (Sandbox Code Playgroud)

两者都生产 0 1 2 3

感谢dystroy的回答,这里有一个编写和阅读我能够适应的三维数组的例子(在这里发帖,因为我很难找到任何这样的例子,所以这可能会帮助其他人):

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

}
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 12

在Go中,与大多数语言一样,您称之为多维数组的是数组数组.该len运营商只给你"外部"数组的长度.

如果你看到它,也许var声明对你来说更清楚

var a [3]([5]int8)
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

输出

5
5
5
3
Run Code Online (Sandbox Code Playgroud)

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

for _, h := range a {
    for _, cell := range h {
        fmt.Print(cell, " ")
    }
    fmt.Println()
}
Run Code Online (Sandbox Code Playgroud)

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

    for i, cell := range h { // i is the index, cell the value
        h[i] = 2 * cell
    }
Run Code Online (Sandbox Code Playgroud)