15

是否可以在多维数组上使用 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()
    }

}
4

3 回答 3

15

和大多数语言一样,在 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
    }
于 2012-11-19T08:10:29.950 回答
2

已经提供了范围的解决方案,所以我将讨论如何使用长度(len)来遍历golang中的多维数组。

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

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

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

len(arr[1]) will output = 3.

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

于 2020-05-07T19:03:26.370 回答
0

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

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

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

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

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

于 2012-11-19T08:11:41.490 回答