在公司实习的时候,调用json.Unmarshal,报错,可是我的结构体其实是看了redis的json结构的,为什么会出现错误呢?细看才发现,有一个字段有false,有"0",我的结构体字段中是string,当然会报错。
type MyStruct struct {
...
Valid pto.BoolString `json:"valid"
...
}
就是这个valid字段,那么如何兼容bool和string呢?
我们可以用type重新定义一个兼容bool string的类型。
type BoolString string
接着让他实现接口即可
func (i *BoolString) Set(val string) {
*i = BoolString(val)
}
func (i *BoolString) Equal(val string) bool {
return string(*i) == val
}
func (i *BoolString) Val() string {
return string(*i)
}
func (i *BoolString) BoolVal() bool {
if string(*i) == "0" {
return false
} else if string(*i) == "1" {
return true
}
return false
}
// 主要是这个接口
func (i *BoolString) UnmarshalJSON(value []byte) error {
if value[0] == '"' {
var val string
json.Unmarshal(value, &val)
*i = BoolString(val)
} else {
var flag bool
json.Unmarshal(value, &flag)
if flag {
*i = "1"
} else {
*i = "0"
}
}
return nil
}