您的位置:首页 >Go 中安全比较二维切片行列数的方法
发布于2026-04-14 阅读(0)
扫一扫,手机访问

本文介绍在 Go 中判断两个二维切片是否具有相同维度(行数一致且每行列数均相等)的两种方法:通用健壮方案(支持不规则矩阵)和优化简化方案(适用于所有行等长的规则矩阵),并附可运行示例与关键注意事项。
本文介绍在 Go 中判断两个二维切片是否具有相同维度(行数一致且每行列数均相等)的两种方法:通用健壮方案(支持不规则矩阵)和优化简化方案(适用于所有行等长的规则矩阵),并附可运行示例与关键注意事项。
在 Go 中,[][]T 是切片的切片,并非数学意义上的“矩形矩阵”——每一行(即内层切片)可拥有不同长度。因此,仅用 len(matrix) 检查行数是不够的;要确认两个二维切片“尺寸相同”,必须同时验证:
以下函数 match 严格检查两个 [][]int 是否结构完全一致(支持不规则二维切片):
func match(m1, m2 [][]int) bool {
if len(m1) != len(m2) {
return false // 行数不同,直接失败
}
for i, row1 := range m1 {
if len(row1) != len(m2[i]) {
return false // 第 i 行列数不匹配
}
}
return true
}✅ 优点:健壮、无假设、适用于任意二维切片(包括空行、变长行)。
⚠️ 注意:若 m1 或 m2 为 nil,len() 返回 0,但访问 m2[i] 会 panic。生产环境建议前置 nil 检查:
if m1 == nil || m2 == nil {
return m1 == nil && m2 == nil // 二者同为 nil 才视为“相等”
}若业务中保证所有矩阵均为规则矩形(如数值计算、图像像素等场景),可大幅优化:只需比对行数 + 任一对应行的长度(通常取首行):
func match2(m1, m2 [][]int) bool {
if len(m1) != len(m2) {
return false
}
// 处理空矩阵:0 行时无需检查列长
if len(m1) == 0 {
return true
}
return len(m1[0]) == len(m2[0])
}✅ 优点:时间复杂度从 O(n) 降至 O(1),适合高频校验场景。
⚠️ 风险:若输入违反“每行等长”前提(例如 [][]int{{1}, {2,3}}),结果不可靠——此函数不负责验证内部一致性,仅作快速匹配。
package main
import "fmt"
func main() {
// 规则矩阵:2×3 → 应返回 true
m1 := [][]int{{1, 2, 3}, {4, 5, 6}}
m2 := [][]int{{7, 8, 9}, {10, 11, 12}}
fmt.Println("match:", match(m1, m2)) // true
fmt.Println("match2:", match2(m1, m2)) // true
// 不规则矩阵:m1 第二行更长 → match 返回 false,match2 仍返回 true(但结果无意义)
m1 = [][]int{{1, 2, 3}, {4, 5, 6, 7, 8}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12, 13, 14}}
fmt.Println("match:", match(m1, m2)) // true(因两矩阵结构一致)
fmt.Println("match2:", match2(m1, m2)) // true(但若 m2 实际为 {{7},{10,11}} 则 match2 会误判)
// 行数相同但某行列数不同 → 两者均返回 false
m1 = [][]int{{1, 2, 3}, {4, 5, 6, 7, 8}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12, 13}}
fmt.Println("match:", match(m1, m2)) // false
fmt.Println("match2:", match2(m1, m2)) // false
}通过合理选择方案,你既能保障程序鲁棒性,又能兼顾执行效率。
上一篇:《宝可梦Z-A》Z招式还存在吗
下一篇:Word转PDF格式保留兼容性强
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9