我在golang中使用gorm包作为我的数据库库。我有很多数据库表,如" Hosts"或者"订单"。在我的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
}
答案 0 :(得分: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
我只是传递控制器。