假设我们有以下转码
type SectionType int
const (
Header SectionType = iota
Footer
Body
)
var sectionTypeNames = map[string]SectionType{
"header": Header
"footer": Footer
"body": Body
}
type Page struct {
Sections: []SectionType `yaml:"sections"`
}
我们有以下yaml
page1:
- header
- body
有没有办法让goyaml转换" header"的字符串?和"身体"进入各自的int常量类型(在sectionTypeNames
map中定义)我们反序列化Page
结构?
答案 0 :(得分:2)
go-yaml
无法自动执行此操作,因为它只能看到package reflect
公开的类型,并且不包含包中常量的名称。从reflect
的角度来看,并没有真正的包装概念。
听起来你愿意自己做(你已经做过map
等)。所以我认为你可以做的是做SectionType
或*[]SectionType
做Unmarshaler
,提供一个函数来转换字符串YAML包解码为值;我缺乏go-yaml
的具体经验,无法告诉您如何实现它,但总的来说,这就像Unmarshaler
这样的接口。
如果这是你经常遇到的问题,那么可能需要按照stringer
的方式编写一些内容来为你生成地图和反序列化函数(通过检查定义类型的源文件)。在此之前必须有很多类型。