为了账号安全,请及时绑定邮箱和手机立即绑定

用接口干掉我的 Go 函数

用接口干掉我的 Go 函数

Go
PIPIONE 2021-06-14 16:27:11
我有以下功能: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)

}


查看完整回答
反对 回复 2021-06-21
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信