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

}

推荐答案

在Go中,正如在大多数语言中一样,你所说的多维数组是数组的array.len运算符只给出"外部"数组的长度.

如果你把var声明看作

var a [3]([5]int8)

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

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
    }

Go相关问答推荐

为什么使用append时Go切片的初始容量会随着int32和int64类型的不同而变化?

Go汇编器命名为Constants

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

Go协议缓冲区导入问题

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

ChromeDriver不存在(高朗selenium)

Golang文本/模板序列范围

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

我应该先解锁然后再广播吗?

Golang crypto/rand 线程安全吗?

有没有办法计算枚举中定义的项目总数?

如何在模板中传递和访问 struct 片段和 struct

Go 信号处理程序不处理终端窗口关闭

在 Go 中读取数字行

在 Raspberry Pi4 上下载 Go Mod

无法建立连接,因为目标机器主动拒绝它 Golang

如何从 Go 1.18 中的单个方法返回两种不同的具体类型?

从另一个没有重复的确定性 int

AWS EKS 上的 Golang REST API 部署因 CrashLoopBackOff 而失败