2016-11-18 20:41


  • yaml

Suppose we have the following go code

type SectionType int

const (
    Header SectionType = iota

var sectionTypeNames = map[string]SectionType{
  "header": Header
  "footer": Footer
  "body":   Body

type Page struct {
    Sections: []SectionType `yaml:"sections"`

And we have the following yaml

  - header
  - body

Is there a way to get goyaml to convert the strings of "header" and "body" into their respective int constant types (as defined in sectionTypeNames map) we deserializing the Page struct?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答


  • duanji5746 duanji5746 5年前

    go-yaml can't do it automatically because it can only see what package reflect exposes about types, and that doesn't include the names of constants in a package. There isn't really a notion of packages from reflect's perspective at all.

    It sounds like you're willing to do it yourself (you've already made a map, etc). So I think what you can do is make SectionType or *[]SectionType an Unmarshaler, by providing a function that turns the strings the YAML package decodes into values; I lack the specific experience with go-yaml to be able to tell you exactly how to implement it, but in general that's what interfaces like Unmarshaler do.

    If this is something you run into often enough, it might be worthwhile writing something along the lines of stringer to generate the maps and deserialization functions for you (by inspecting the source files that define the types). There have to be a lot of types before that's worthwhile though.

    点赞 评论 复制链接分享