大家好,欢迎来到IT知识分享网。
Go语言二维数组完全指南
二维数组是包含数组的数组,在Go语言中有着广泛的应用场景。下面我会从基础到高级,详细讲解Go中二维数组的各种用法。
一、二维数组的基本概念
1. 什么是二维数组?
二维数组就是”数组的数组”,可以想象成表格或矩阵:
[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
2. 声明与初始化
// 方法1:直接初始化 var matrix1 [3][3]int = [3][3]int{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, } // 方法2:先声明后赋值 var matrix2 [2][2]string matrix2[0][0] = "a" matrix2[0][1] = "b" matrix2[1][0] = "c" matrix2[1][1] = "d" // 方法3:自动推断长度 matrix3 := [...][2]int{ {1, 2}, {3, 4}, }
二、二维数组的实际应用案例
案例1:矩阵运算
func main() { // 定义两个2x2矩阵 a := [2][2]int{{1, 2}, {3, 4}} b := [2][2]int{{5, 6}, {7, 8}} var result [2][2]int // 矩阵相加 for i := 0; i < 2; i++ { for j := 0; j < 2; j++ { result[i][j] = a[i][j] + b[i][j] } } fmt.Println(result) // [[6 8] [10 12]] }
案例2:井字棋游戏
func printBoard(board [3][3]string) { for i := 0; i < 3; i++ { fmt.Println(board[i]) } } func main() { // 初始化3x3游戏棋盘 board := [3][3]string{ {" ", " ", " "}, {" ", " ", " "}, {" ", " ", " "}, } // 玩家X下棋 board[1][1] = "X" printBoard(board) /* 输出: [ ] [ X ] [ ] */ }
三、二维数组的高级用法
1. 动态二维数组(使用切片)
固定大小的数组不够灵活,实际开发中更多使用切片实现二维数组:
func main() { // 创建3x3的动态二维切片 matrix := make([][]int, 3) for i := range matrix { matrix[i] = make([]int, 3) } // 赋值 matrix[0][0] = 1 matrix[1][1] = 5 matrix[2][2] = 9 fmt.Println(matrix) // [[1 0 0] [0 5 0] [0 0 9]] }
2. 不规则二维数组
Go中的二维切片可以是”不规则”的(每行长度不同):
func main() { // 创建不规则二维切片 irregular := [][]int{ {1}, {2, 3}, {4, 5, 6}, } fmt.Println(irregular) // [[1] [2 3] [4 5 6]] }
3. 遍历二维数组
func main() { matrix := [][]int{ {1, 2, 3}, {4, 5, 6}, } // 方法1:使用索引 for i := 0; i < len(matrix); i++ { for j := 0; j < len(matrix[i]); j++ { fmt.Printf("%d ", matrix[i][j]) } fmt.Println() } // 方法2:range遍历 for _, row := range matrix { for _, val := range row { fmt.Printf("%d ", val) } fmt.Println() } }
四、二维数组与函数
1. 作为函数参数
func sumMatrix(m [3][3]int) int { sum := 0 for _, row := range m { for _, val := range row { sum += val } } return sum } func main() { matrix := [3][3]int{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, } fmt.Println(sumMatrix(matrix)) // 45 }
2. 返回二维数组
func createIdentityMatrix(size int) [][]int { matrix := make([][]int, size) for i := range matrix { matrix[i] = make([]int, size) matrix[i][i] = 1 } return matrix } func main() { idMatrix := createIdentityMatrix(3) fmt.Println(idMatrix) // [[1 0 0] [0 1 0] [0 0 1]] }
五、二维数组的注意事项
- 内存布局:
- Go中的二维数组在内存中是连续存储的
- 访问顺序影响性能(行优先访问更快)
- 性能优化:
- // 不好的访问方式(列优先) for j := 0; j < cols; j++ { for i := 0; i < rows; i++ { fmt.Println(matrix[i][j]) } } // 好的访问方式(行优先) for i := 0; i < rows; i++ { for j := 0; j < cols; j++ { fmt.Println(matrix[i][j]) } }
- 与切片的区别:
- 数组是值类型,赋值会拷贝整个数组
- 切片是引用类型,赋值只拷贝指针
六、综合练习:图像处理
// 定义图像类型(二维数组表示像素) type Image [][]Pixel type Pixel struct { R, G, B uint8 } // 转换为灰度图 func (img Image) ToGrayscale() { for i := range img { for j := range img[i] { gray := uint8(0.299*float64(img[i][j].R) + 0.587*float64(img[i][j].G) + 0.114*float64(img[i][j].B)) img[i][j] = Pixel{gray, gray, gray} } } } func main() { // 创建一个2x2的彩色图像 img := Image{ {{255, 0, 0}, {0, 255, 0}}, {{0, 0, 255}, {255, 255, 255}}, } img.ToGrayscale() fmt.Println(img) }
七、总结
- 固定大小二维数组:[m][n]T 形式,适合已知维度的场景
- 动态二维切片:[][]T 更灵活,是实际开发中最常用的
- 核心操作: 初始化(注意切片需要双重make) 遍历(推荐range方式) 作为函数参数传递
- 应用场景: 数学计算(矩阵运算) 游戏开发(棋盘、地图) 图像处理(像素矩阵)
通过不断练习,你会熟练掌握二维数组的各种用法!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/186469.html