GoLang之如何比较两个map[string]interface{}是否相等
再Go语言中,Map是一个内置类型,它将键与值绑定在一起,可以通过键获取响应的值。
由于Go Map内部存储机制是以key为hash的结构来实现的,所以顺序是混乱的。
举例说明:在两次遍历中读取数据的顺序是不一样的。
func main() {
a := map[string]interface{}{
"orange": "1",
"apple": "2",
"banana": "3",
}
fmt.Println("第一遍:")
for k, v := range a {
fmt.Print(k + " : ")
fmt.Println(v)
}
fmt.Println("第二遍:")
for k, v := range a {
fmt.Print(k + " : ")
fmt.Println(v)
}
}
/*
第一遍:
apple : 2
banana : 3
orange : 1
第二遍:
banana : 3
orange : 1
apple : 2
*/
首先,我们可以将它们转化为 json 字符串来比较即可,但是因为Map是无序的,所以转化的json字符串不一定会一模一样。(当然,你也可以用反射来做,但是代码量多,麻烦。)
所以我们可以将其转化成顺序一样的 slice ,然后再转化未 json 。 这样就确保的json可以一样了。
func CompareTwoMapInterface(data1 map[string]interface{},
data2 map[string]interface{}) bool {
keySlice := make([]string, 0)
dataSlice1 := make([]interface{}, 0)
dataSlice2 := make([]interface{}, 0)
for key, value := range data1 {
keySlice = append(keySlice, key)
dataSlice1 = append(dataSlice1, value)
}
for _, key := range keySlice {
if data, ok := data2[key]; ok {
dataSlice2 = append(dataSlice2, data)
} else {
return false
}
}
dataStr1, _ := json.Marshal(dataSlice1)
dataStr2, _ := json.Marshal(dataSlice2)
return string(dataStr1) == string(dataStr2)
}