1 回答

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是您需要的中間類型:
type tmpFruitBasket struct {
Capacity int
Apple []yaml.Node `yaml:"Apple"`
Banana []yaml.Node `yaml:"Banana"`
}
然后,加載函數(shù)將如下所示:
// helper to load a list of nodes as a concrete type
func appendFruits(fruits []Fruit, kind reflect.Type, input []yaml.Node) ([]Fruit, error) {
for i := range input {
val := reflect.New(kind).Interface()
if err := input[i].Decode(val); err != nil {
return nil, err
}
fruits = append(fruits, val.(Fruit))
}
return fruits, nil
}
func (fruitBasket *FruitBasket) UnmarshalYAML(value *yaml.Node) error {
var tmp tmpFruitBasket
if err := value.Decode(&tmp); err != nil {
return err
}
fruitBasket.Capacity = tmp.Capacity
var fruits []Fruit
var err error
// sadly, there is no nicer way to get the reflect.Type of Apple / Banana
fruits, err = appendFruits(
fruits, reflect.TypeOf((*Apple)(nil)).Elem(), tmp.Apple)
if err != nil {
return err
}
fruits, err = appendFruits(
fruits, reflect.TypeOf((*Banana)(nil)).Elem(), tmp.Banana)
if err != nil {
return err
}
fruitBasket.Fruits = fruits
return nil
}
編輯:如果您堅(jiān)持將每種類型排序到專用切片中,您當(dāng)然可以直接將它們鍵入為[]Appleand[]Banana并合并它們。這個(gè)答案是從您之前的問(wèn)題開(kāi)始深入探討動(dòng)態(tài)加載不同類型的輸入問(wèn)題的延續(xù)。僅當(dāng)您在某些時(shí)候不再知道靜態(tài)類型時(shí),這樣做才有意義(例如,如果您提供 API 在運(yùn)行時(shí)添加其他水果類型)。
- 1 回答
- 0 關(guān)注
- 204 瀏覽
添加回答
舉報(bào)