二维数组
应用场景: 五子棋
地图也是二维数组,有3D地图
定义使用
package mainimport "fmt"func main() { var arr [4][6]int fmt.Println("arr = ", arr) // arr = [[0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0]] arr[1][2] = 1 arr[2][1] = 2 arr[2][2] = 3 fmt.Println("arr = ", arr) for i := 0; i < len(arr); i++ { fmt.Printf("第%v个数组 = ", i+1) for j := 0; j < len(arr[i]); j++ { fmt.Printf("%v ", arr[i][j]) } fmt.Println() } /* 第1个数组 = 0 0 0 0 0 0 第2个数组 = 0 0 1 0 0 0 第3个数组 = 0 2 3 0 0 0 第4个数组 = 0 0 0 0 0 0 */}
直接初始化二维数组
// 声明并初始化var arr3 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}fmt.Println("arr3 = ", arr3) // arr3 = [[1 2 3] [4 5 6]]
内存分配
// 二维数组内存探究var arr2 [2][3]intarr2[1][1] = 10fmt.Println("arr2 = ", arr2) // arr2 = [[0 0 0] [0 10 0]]// 0xc00000a3f0 + 3(元素个数) * 8(int占8个字节) = 0xc00000a408fmt.Printf("arr2[0]的地址: %p\n", &arr2[0]) // 0xc00000a3f0fmt.Printf("arr2[1]的地址: %p\n", &arr2[1]) // 0xc00000a408// 上面的地址就是数组元素首地址fmt.Println("arr2[0][0]的地址: ", &arr2[0][0]) // 0xc00000a3f0fmt.Println("arr2[1][0]的地址: ", &arr2[1][0]) // 0xc00000a408
二维数组遍历
// 遍历var arr4 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}for i := 0; i < len(arr4); i++ { fmt.Printf("第%v层", i) for j := 0; j < len(arr4[i]); j++ { fmt.Printf("%v ", arr4[i][j]) } fmt.Println()}// for rangefor i, v := range arr4 { fmt.Printf("i = %v, v = %v\n", i, v) for j, v2 := range v { /* range创建每个元素的副本,而不是直接返回对该元素的引用 迭代返回变量是一个迭代过程中根据切片依次赋值的新变量 所以v的地址总是相同的 要想获取每个元素的地址,可以使用切片变量和索引值 */ fmt.Printf("arr4[%v][%v] = %v, 地址:%v \n", i, j, v2, &v2) } fmt.Println()}