2013-04-21 37 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

相關問題