[英]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.