我想出了一些类似的方法(至少适用于我目前的情况):


      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
}

      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")
    }
}