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当中却是新增了值,这样就得不偿失了。 解决办法:
- 如果不想替换map就每次解析前重新初始化一次map,
- 如果可以更替就更替为interface{}或者自定义struct即可。