Go语言二维数组_二维数组怎么用gets输入
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方式) 作为函数参数传递
- 应用场景: 数学计算(矩阵运算) 游戏开发(棋盘、地图) 图像处理(像素矩阵)
通过不断练习,你会熟练掌握二维数组的各种用法!