1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
這在序列化時(shí)會(huì)起作用,因?yàn)樵谛蛄谢陂gObjects數(shù)組的每個(gè)元素都是結(jié)構(gòu)。當(dāng)你反序列化時(shí)它將不起作用,因?yàn)樵诜葱蛄谢陂g,Objects是一個(gè)空的接口數(shù)組。您不能解組到接口,只能解組到結(jié)構(gòu)或值。
要解決此問(wèn)題,您必須在反序列化期間找出每個(gè)數(shù)組元素的類型Objects,然后根據(jù)結(jié)構(gòu)進(jìn)行反序列化。有多種方法可以做到這一點(diǎn)。
一種方法是使用fat 接口,這是一個(gè)包含所有可能項(xiàng)目的臨時(shí)結(jié)構(gòu):
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
}
錯(cuò)誤檢查被省略。
可以使用相同的方法來(lái)map[string]interface{}代替unmarshalObject,但這需要大量的類型斷言。
- 1 回答
- 0 關(guān)注
- 204 瀏覽
添加回答
舉報(bào)