如何在Golang中比较[][]string数组?自定义断言函数未生效
在Golang中正确比较[][]string二维数组的方法
我来帮你看看这个问题~你的断言函数有几个关键问题导致没法正确校验二维字符串数组,咱们一步步理清楚:
你的代码存在的问题
- 循环逻辑错误:内层循环你用了
len(ans)(二维数组的行数),但实际上应该遍历当前子数组的长度(列数)。这样错误的循环会导致你拿test[i][j]和ans[i][j]比较时,j的取值范围完全不对,甚至会出现索引越界 panic。 - 缺少前置校验:没有先检查两个二维数组的行数是否相等,也没检查对应行的列数是否相等。如果两个数组的结构不一样(比如一个3行2列,一个2行3列),直接进入循环肯定会出问题。
- 错误提示不够清晰:找到不相等的元素后,没有明确输出位置信息,也没有终止断言(比如返回错误或panic),很难定位具体哪里错了。
修正后的断言函数
import "fmt" func assertEq(test [][]string, ans [][]string) { // 先校验外层数组长度(行数)是否一致 if len(test) != len(ans) { fmt.Printf("数组行数不匹配:test有%d行,ans有%d行\n", len(test), len(ans)) fmt.Printf("test: %v\nans: %v\n", test, ans) return } // 遍历每一行 for i := range test { // 校验当前行的列数是否一致 if len(test[i]) != len(ans[i]) { fmt.Printf("第%d行列数不匹配:test该行有%d列,ans该行有%d列\n", i, len(test[i]), len(ans[i])) fmt.Printf("test行内容:%v\nans行内容:%v\n", test[i], ans[i]) continue } // 遍历当前行的每一个元素 for j := range test[i] { if test[i][j] != ans[i][j] { fmt.Printf("第%d行第%d列元素不匹配:test值为\"%s\",ans值为\"%s\"\n", i, j, test[i][j], ans[i][j]) fmt.Printf("test: %v\nans: %v\n", test, ans) // 如果想发现第一个错误就终止,可以在这里return或panic // return } } } fmt.Println("所有元素匹配成功!") }
额外补充:使用标准库简化实现
如果你不想手动写循环,Go标准库的reflect.DeepEqual可以直接比较任意类型的深层相等性,包括二维字符串数组:
import ( "fmt" "reflect" ) func assertEq(test [][]string, ans [][]string) { if !reflect.DeepEqual(test, ans) { fmt.Printf("数组不匹配:\ntest: %v\nans: %v\n", test, ans) } else { fmt.Println("所有元素匹配成功!") } }
不过要注意:reflect.DeepEqual是强类型匹配,如果两个数组的元素类型不同(比如一个是[][]string,一个是[][]interface{})会返回false,但对于你的场景完全适用。
内容的提问来源于stack exchange,提问作者nagulan
相关产品推荐
相关产品推荐

