2012-11-19 52 views
9

是否可以在多维数组上使用范围和len?Go:多维数组的范围和len?

要么使用var [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() 
    } 

} 

回答

7

在Go中,和大多数语言一样,你称之为多维数组是数组的数组。 len运算符只给你“外部”数组的长度。

也许如果你把它看成

var a [3]([5]int8) 

也编译VAR声明可以为你清晰。它是一个大小为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 
} 

输出

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 
    } 
+0

如果/当数组大小不知道/记忆时,什么是循环多维数组内容的好方法?基于'len(a)'和'_,var:= range a'的2个循环?对'_,_,var:= range a'使用范围缩放3(或更多)维数组的方式吗? – kilves76

+0

我用解决方案编辑循环:你需要两个循环。 –

+0

谢谢你的例子,我找不到任何地方。 – kilves76