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
в обоих случаях вы используете внешний массив.