1 回答

TA貢獻1810條經(jīng)驗 獲得超4個贊
這在序列化時會起作用,因為在序列化期間Objects數(shù)組的每個元素都是結構。當你反序列化時它將不起作用,因為在反序列化期間,Objects是一個空的接口數(shù)組。您不能解組到接口,只能解組到結構或值。
要解決此問題,您必須在反序列化期間找出每個數(shù)組元素的類型Objects,然后根據(jù)結構進行反序列化。有多種方法可以做到這一點。
一種方法是使用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 關注
- 188 瀏覽
添加回答
舉報