我正在尝试在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
答案 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)
}