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的值或数据类型都不相同!请核查!")
- }
- }