处理程序中的Golang抽象,以避免代码重复

时间:2016-07-14 12:15:27

标签: go go-gorm go-gin

我正在尝试在golang中实现抽象 我正在使用gorm orm库和gin框架

  

基类

type Base struct {
  Context *gin.Context // Passing gin request
}

func (b *Base ) Add() {
   err := b.Context.BindJSON(b)
   if err != nil {
     // handling error here
   }
   gorm.db.Create(b) // Here I am adding base data to database
}
  

儿童班

type Shopper struct { 
   Base  // Embedding Base struct
   Name string,
   Address string,
   ContactNo int
}
  

处理程序

 func handler (c *gin.Context) {
  s := new(Shopper)
  s.Context = c
  s.Add()  // Here I am expecting Add() method should bind JSON to shopper struct
           // entry to database using gorm
 }

Add()方法没有采用shopper struct所拥有的任何属性。

我想在每个code duplication中避免使用handler 只需从请求正文中获取json,然后使用database

添加到相应的gorm

1 个答案:

答案 0 :(得分:3)

你不能因为Go does not have inheritance

让我再说一遍:Go没有继承权,所以请在使用Go时忘掉这个“基础”和“孩子”的东西。

你的代码不起作用的原因是方法集的 嵌入式类型确实被“提升”并合并到方法集中 当任何这样的方法被调用时,嵌入它的类型 它的接收器是嵌入式的值,而不是 封闭类型的值。

我的Add()方法始终会收到Base

类型的值

如果封闭类型具有相同名称的方法 作为嵌入式的一种方法,你可以调用这种方法 关于封闭类型的值,封闭的方法 类型将被调用。 所以没有超载,但如果你愿意,那就是“重写”。

我在你的情况下做的是停止在OOP中思考 并写了一个函数而不是一个方法(未经测试):

func add(any interface{}, ctx *gin.Context) {
   err := ctx.BindJSON(any)
   if err != nil {
     // handling error here
   }
   gorm.db.Create(any) // Here I am adding base data to database
}

然后在你的处理程序中:

func handler (c *gin.Context) {
  s := new(Shopper)
  s.Context = c
  add(s, c)
}