1

我正在尝试在 golang 中实现抽象我正在使用gormorm 库和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结构具有的任何属性。

在这里,我只是想避免code duplication在每个handler只从请求正文中获取 json 并添加到各自的database使用中gorm

4

1 回答 1

3

你不能因为Go 没有继承

让我重复一遍:Go 没有继承,所以在使用 Go 时请不要学习这些“基础”和“子”的东西。

您的代码不起作用的原因是,虽然嵌入式类型的方法集确实被“提升”并合并到嵌入它的类型的方法集中,但当任何此类方法被调用时, 它的接收者就是嵌入的值type而不是封闭类型的值。

IOW 你的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)
}
于 2016-07-14T20:31:30.963 回答