func DeepEqual(x, y any) bool {
reflect.DeepEqual(a any,b any)主要比较切片,map的深度是否一致,包括数据的值,以及数据类型是否一致。
但是在比较的时候,reflect.DeepEqual()
函数在比较 Map ,slice等是会考虑键值对的顺序的。
map如果mapA,和mapB的顺序不一致,会返回false。
创建2个user1.json,user2.json,代码如下
{
"users": [
{
"name": "gloria",
"age": 22,
"social": {
"zhihu": "https://zhihu.com",
"weibo": "https://weibo.com"
}
},
{
"name": "Aric",
"age": 27,
"social": {
"weibo": "https://weibo.com",
"zhhu": "https://zhihu.com"
}
}
]
}
// Users 最外面的大括号,肯定是整个的
type Users struct {
// 整个是一个users数组
Users []User `json:"users"`
}
// Social 每个Users中又有一个单独的json格式的Social,又分一个结构体
type Social struct {
Zhihu string `json:"zhihu"`
Weibo string `json:"weibo"`
}
// User 数组中的每一个元素是一个Users
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Social Social `json:"social"`
}
尝试写下代码。
func LoadJson(path string, dist interface{}) (err error) {
var content []byte
content, err = ioutil.ReadFile(path)
if err != nil {
log.Println("readFile失败!错误信息为:", err)
}
err = json.Unmarshal(content, dist)
if err != nil {
log.Println("readFile失败!错误信息为:", err)
}
return err
}
func main() {
// 定义两个map存储json格式的数据
m1 := make(map[string]interface{})
m2 := make(map[string]interface{})
err := service.LoadJson("testjson/user.json", &m1)
if err != nil {
log.Println("LoadJson Err:", err)
}
err = service.LoadJson("testjson/user2.json", &m2)
if err != nil {
log.Println("LoadJson Err:", err)
}
/*jsonA, _ := json.Marshal(m1)
jsonB, _ := json.Marshal(m2)
if string(jsonA) == string(jsonB) {
fmt.Println(true)
} else {
fmt.Println(false)
}*/
isEqual := reflect.DeepEqual(m1, m2)
if isEqual {
fmt.Println("m1和m2的值和数据类型都相同")
} else {
fmt.Println("m1和m2的值或数据类型都不相同!请核查!")
}
}