2013-04-21 52 views
2

我想制作一个通用模型结构嵌入在将使用gorphttps://github.com/coopernurse/gorp)来坚持我的MySQL数据库中的对象的结构。我的理解是,这种组合是如何在Go中完成那些用强OO语言继承的东西。Golang:有没有办法在Go的组合模型中访问“父”结构的方法中的“子”结构?

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

有没有什么方法可以找出/使用我在(嵌入超类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:[email protected]_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) 
    } 
} 

GorpModel结构的New属性是用来保持它是否是一个新创建的模型跟踪,我们是否应该呼吁SaveUpdateInsert(这是在孩子User结构,此刻定义)。

回答

2

有什么办法弄清楚/用我的(这GorpModel嵌入超)

号是哪一种类型

我不知道的最好方式来构建你的解决方案,但是对于你试图在某种基类中实现的CRUD,只需将它们编写为函数即可。即。

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

谢谢你好先生。这最终目前正满足我的需求。 – ZenLikeThat 2013-04-22 03:36:57

相关问题