我有以下功能:func (r *Resource) Create(kind string, data io.ReadCloser) (err error) { decoder := json.NewDecoder(data) r.Kind = kind switch kind { case "user": var user User if err = decoder.Decode(&user); err != nil { panic(err) } if err = user.Save(r.Context); err != nil { panic(err) } r.Data = user break case "space": var space Space if err = decoder.Decode(&space); err != nil { panic(err) } if err = space.Save(r.Context); err != nil { panic(err) } r.Data = space break case "room": var room Room if err = decoder.Decode(&room); err != nil { panic(err) } if err = room.Save(r.Context); err != nil { panic(err) } r.Data = room break case "element": var element Element if err = decoder.Decode(&element); err != nil { panic(err) } if err = element.Save(r.Context); err != nil { panic(err) } r.Data = element break default: break } return}如您所见,除了接收 JSON 数据的结构类型之外,开关中的每种情况都是相同的。我怀疑在接口和类型断言中有一个答案。
1 回答
Qyouu
TA贡献1786条经验 获得超11个赞
您可以将实例化移动到单行函数并创建一个映射,将种类映射到相应的实例化函数。其余的代码应该是可重用的。
例子:
kinds := map[string]func() Entity {
"user": func() Entity { return &User{} },
"space": func() Entity { return &Space{} },
"room": func() Entity { return &Room{} },
}
func Create(kind string) {
instance := kinds[kind]()
decoder.Decode(instance)
saveEntity(instance)
}
- 1 回答
- 0 关注
- 178 浏览
添加回答
举报
0/150
提交
取消