首页 文章

如何删除Go with Gorm中的重复代码

提问于
浏览
0

我在golang中使用gorm包作为我的数据库库 . 我有很多数据库表,如“主机”或“订单” . 在我的CRUD App中,每个Controller都有setHost / setOrder函数....

我可以为每个控制器编写这个set函数 . 但更好的方法是只使用一个函数,我将使用第一个参数创建具有相同类作为参数的对象,然后将其传递给gorm,它将用数据库中的数据填充它,然后返回它 . 我尝试使用反射,但失败了,因为我可能不太了解它 .

也许我只是没有在gorm库中发现某些功能,或者我无法正确使用反射包 . 我该如何实现set函数 . 是否可以实现此功能,还是应该重复我的代码?

type Host struct {
  gorm.Model
  name string
}

type Order struct {
  gorm.Model
  RoomSize int
}

func setOrder(c *gin.Context) (order models.Order) {
  db := dbpkg.DBInstance(c)
  id := new(ApplicationController).extractID(c)

  db.First(&order, id)

  if order.ID != id {
    log.Panicf("No Object with the ID: %d", id)
  }
  return
}

func setHost(c *gin.Context) (host models.Host) {
    db := dbpkg.DBInstance(c)
    id := new(ApplicationController).extractID(c)

    db.First(&host, id)

    if host.ID != id {
        log.Panicf("No Object with the ID: %d", id)
    }

    return host
}

func (ctrl ApplicationController) extractID(c *gin.Context) uint64 {
    id, err := strconv.ParseUint(c.Params.ByName("id"), 10, 64)
    if err != nil {
        log.Panicf("ID: %s can not parse to an uint64", c.Params.ByName("id"))
    }
    return id
}

1 回答

  • 0

    让您的控制器实现具有 extractID 功能的接口 . 然后为每个控制器实现 extractID . 有点像这个例子:

    package main
    
    import "fmt"
    
    type IDInterface interface {
        ExtractString()
    }
    
    type OrderController struct {
        IDInterface
        OrderData string
    }
    
    type HostController struct {
        IDInterface
        HostData string
    }
    
    func (c OrderController) ExtractString() {
        fmt.Println("Data: " + c.OrderData)
    }
    
    func (c HostController) ExtractString() {
        fmt.Println("Data: " + c.HostData)
    }
    
    func main() {
        o := OrderController{OrderData: "I'm an order!"}
        h := HostController{HostData: "I'm a host!"}
        printData(o)
        printData(h)
    }
    
    func printData(inter IDInterface) {
        inter.ExtractString()
    }
    

    注意 printData 接收 IDInterface ,但在 main 中我只是传递控制器 .

相关问题