Go map的一个坑点记录

Go中map的一个上当受骗的坑,示例代码如下:

    type Info struct {
	    Name string `json:"name"`
		XXS map[string]interface{} `json:"xxs"`
    }
	
	var result *Info

    info1 := &Info{
	    Name : "张三",
		XXS : map[string]interface{}{
		 "111": "zheshi1"	
       }
    }
	
	info1Json,_ := json.Marshal(info1)
	
	// 反解析到result
	_ = json.Unmarshal(info1Json,&result)
	
	fmt.Println("此时解析结果是: ",result)
	// &{张三 map[111:zheshi1]}

	// 第二次
    info2 := &Info{
        Name : "李四",
        XXS : map[string]interface{}{
            "222": "zheshi2"
        }
    }
    
    info2Json,_ := json.Marshal(info2)
    
    // 反解析到result
    _ = json.Unmarshal(info2Json,&result)
    
    fmt.Println("此时解析结果是: ",result)
	// // &{李四 map[111:zheshi1 222:zheshi2]}

上述代码在某些场景下可能会导致bug的产生,因为我们可能只想在第二次的时候全部重新覆盖map当中的所有属性和值 但是此时只是覆盖了非map的属性值,而map当中却是新增了值,这样就得不偿失了。 解决办法:

  1. 如果不想替换map就每次解析前重新初始化一次map,
  2. 如果可以更替就更替为interface{}或者自定义struct即可。