Go: диапазон и len многомерного массива?

можно ли использовать 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 ?

благодаря ответу дистроя, вот пример написания и чтения трехмерного массива, который я смог адаптировать (публикация здесь, потому что у меня было много проблем с поиском каких-либо примеров этого, так что, возможно, это поможет кому-то еще):

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

}

2 ответов


в Go как и в большинстве языков, то, что вы называете многомерным массивом, является массивом массивов. The 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
    }

нет, первый производит 0,1,2 ( индекс в диапазоне )

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

и второй производит 3 (длина массива).

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

в обоих случаях вы используете внешний массив.