Golang:有没有办法在Go的组合模型中访问“父”结构的方法中的“子”结构?

时间:2013-04-21 17:03:35

标签: oop orm go

我想创建一个通用模型结构来嵌入将使用gorphttps://github.com/coopernurse/gorp)来保存MySQL数据库中的对象的结构。我的理解是,这种组合是人们如何通过强大的OO语言完成继承所完成的事情。

我还没有好运,因为我想在GorpModel结构上定义所有CRUD方法,以避免在每个模型中重复它们,但这会导致{{1} (因为我现在正在使用它)假设我要与之交互的表由于gorp使用的反射而被称为GorpModel。这自然会导致错误,因为我的数据库中没有这样的表。

有没有办法找出/使用我所在的类型(嵌入了gorp的超类)以使下面的代码工作,或者我是否完全咆哮错误的树?

GorpModel

package models import ( "fmt" "reflect" "github.com/coopernurse/gorp" "database/sql" _ "github.com/go-sql-driver/mysql" ) type GorpModel struct { New bool `db:"-"` } var dbm *gorp.DbMap = nil func (gm *GorpModel) DbInit() { gm.New = true if dbm == nil { db, err := sql.Open("mysql", "username:password@my_db") if err != nil { panic(err) } dbm = &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}} dbm.AddTable(User{}).SetKeys(true, "Id") dbm.CreateTables() } } func (gm *GorpModel) Create() { err := dbm.Insert(gm) if err != nil { panic(err) } } func (gm *GorpModel) Delete() int64 { nrows, err := dbm.Delete(gm) if err != nil { panic(err) } return nrows } func (gm *GorpModel) Update() { _, err := dbm.Update(gm) if err != nil { panic(err) } } 结构的New属性用于跟踪它是否是新创建的模型,以及我们是否应该在GorpModelUpdate上调用Insert {1}}(目前在子Save结构中定义)。

1 个答案:

答案 0 :(得分:2)

  

有没有办法找出/使用我所在的类型(GorpModel所嵌入的超类)

没有

我不知道构建解决方案的最佳方法,但是对于您尝试在某种基类中实现的CRUD,只需将它们写为函数即可。即

func Create(gm interface{}) { // or whatever the signature should be
    err := dbm.Insert(gm)
    if err != nil {
        panic(err)
    }
}