簡體   English   中英

如何在Gorm中刪除重復的代碼

[英]How to remove duplicated code in Go with Gorm

我正在使用gorm軟件包作為golang中的數據庫庫。 我有很多數據庫表,例如“主機”或“訂單”。 在我的CRUD應用程序中,每個控制器都有功能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
}

讓您的控制器實現一個具有您的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是我只是通過了控制器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM