1 回答
TA贡献1810条经验 获得超4个赞
这在序列化时会起作用,因为在序列化期间Objects数组的每个元素都是结构。当你反序列化时它将不起作用,因为在反序列化期间,Objects是一个空的接口数组。您不能解组到接口,只能解组到结构或值。
要解决此问题,您必须在反序列化期间找出每个数组元素的类型Objects,然后根据结构进行反序列化。有多种方法可以做到这一点。
一种方法是使用fat 接口,这是一个包含所有可能项目的临时结构:
type unmarshalObject struct {
Type string `yaml:"type"`
// All possible fields of all possible implementations
}
type unmarshalCollection struct {
Objects []unmarshalObject `yaml:"objects,omitempty"`
}
func (c *Collection) Deserialize(raw []byte) error {
var intermediate unmarshalCollection
yaml.Unmarshal(raw, &intermediate)
c.Objects=make([]Object,0)
for _,object:=range intermediate.Objects {
switch object.Type {
case "rect":
c.Objects=append(c.Objects,Rectangle{X1:object.X1,...})
case "...":
...
}
}
return nil
}
错误检查被省略。
可以使用相同的方法来map[string]interface{}代替unmarshalObject,但这需要大量的类型断言。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报