解答区大部分都是说把map内容先按key比对,然后marshal到有序json,用string做对比
再往下看看,有老哥说可以直接用反射做比对
package main
import(
"fmt"
"relflect")
func main() {
var m map[string]int
var n map[string]int
fmt.Println(reflect.DeepEqual(m,n))
}
直接上测试代码:
func TestEqual(t *testing.T) {
x := make(map[string]int)
x["test1"] = 1
x["test2"] = 2
m := x
y := make(map[string]int)
y["test1"] = 1
y["test2"] = 2
n := y
fmt.Println(reflect.DeepEqual(m, n)) //true
n["test1"] = 3
fmt.Println(reflect.DeepEqual(m, n)) //false
n["test1"] = 1
n["test3"] = 3
fmt.Println(reflect.DeepEqual(m, n)) //false
}
通过测试数据可以看到,是可以解决上述问题的
首先是外部接口 DeepEqual的实现:
第一步,判断是否为nil,这步比较简单,我就不贴出来了
第二步,运用Value和Type判断是否是同类型数据
v1 := ValueOf(x)
v2 := ValueOf(y)
下面这句其实在第三步里有过调用,我感觉是多余的,或许是为了逻辑清晰吧
if v1.Type() != v2.Type() { return false }
第三步,是封装的私有函数调用,deepValueEqual(v1, v2, make(map[visit]bool))
如果只以咱们这道题的map[string]int 为例的话:
deepValueEqual的调用顺序如下:
v1,v2是否有效
v1,v2类型是否相同
switch(v1.Kind()){
case Map:
range v1.MapKeys()
val1,val2 是map里相同key的值, if !deepValueEqual(val1,val2,visited) return false
}
看到这里,想必你也明白了,其实这里没什么玄乎的地方,解决方法跟咱们通常想到的map range比对法一模一样,只是人家的函数更严谨,更底层,更抽象