转:多维数组的range和len?

问题描述 投票:12回答:3

可以在多维数组上使用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的回答,这里有一个写和读三维数组的例子,我能够适应(在这里发帖是因为我很难找到任何例子,所以也许这将帮助别人)。

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
3个回答
14
投票

在围棋中,和大多数语言一样,你所说的多维数组就是一个数组。在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
    }

1
投票

已经提供了范围的解决方案,所以我将讨论如何在golang中使用长度(len)来通过一个多元素数组。

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

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

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

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

示例代码在这里提供。https:/play.golang.orgpXerzPhkQrhU


0
投票

不是,第一个产生0,1,2(范围内的指数)。

http:/play.golang.orgp0KrzTRWzKO

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

http:/play.golang.orgp0esKFqQZL0

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

© www.soinside.com 2019 - 2024. All rights reserved.