我有一个枚举定义为
type MyEnum int
const(
FirstEnum MyEnum = iota
)
然后,我有一个具有键值对"Key": "FirstEnum"
的json。我是这样解组的。
var data map[string]interface{}
err := json.Unmarshal([]byte(json), &data)
x := data["key"].(MyEnum)
但是,当我运行它时,我收到错误:
panic: interface conversion: interface {} is string, not ps.Protocol [recovered]
panic: interface conversion: interface {} is string, not ps.Protocol
有没有办法让这个工作像一个枚举的字符串表示到Go中的枚举类型的正常转换?
我想出了一些以类似方式工作的东西(至少适用于我目前的情况):
使用string
来表示类似enum
的常量:
type MyEnum string
const(
FirstEnum MyEnum = "FirstEnum"
)
现在,使用解码json自定义类型,如here所述。
data := MyJsonStruct{}
err := json.Unmarshal([]byte(json), &data)
MyJsonStruct
看起来像:
type MyJsonStruct struct {
Key MyEnum
}
然后,您可以使MyJsonStruct实现Unmarshaler
接口,以便您可以验证给定的值。
func (s *MyJsonStruct) UnmarshalJSON(data []byte) error {
// Define a secondary type so that we don't end up with a recursive call to json.Unmarshal
type Aux MyJsonStruct;
var a *Aux = (*Aux)(s);
err := json.Unmarshal(data, &a)
if err != nil {
return err
}
// Validate the valid enum values
switch s.Key {
case FirstEnum, SecondEnum:
return nil
default:
s.Key = ""
return errors.New("invalid value for Key")
}
}