猿问

用接口干掉我的 Go 函数

我有以下功能:


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 数据的结构类型之外,开关中的每种情况都是相同的。


我怀疑在接口和类型断言中有一个答案。


PIPIONE
浏览 179回答 1
1回答

Qyouu

您可以将实例化移动到单行函数并创建一个映射,将种类映射到相应的实例化函数。其余的代码应该是可重用的。例子: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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答