golang中接口间conn指针的共享

golang中接口间conn指针的共享,go,Go,我试图实现的是在多个函数之间共享db.sqlx指针,除了说沿着指针传递的帖子,这很好,但是如何在接口中实现呢?我在任何地方都找不到任何能说明这个用法的东西。基本上我有一个Datastore类型的接口。我还有实现数据存储类型的mysql和pgsql。接口本身工作正常,但问题是我正在尝试为*sqlx.DB创建一个连接函数,以便在实现的接口内的所有函数之间共享。我想问题是我把自己弄糊涂了,不知道如何在接口的函数之间共享指针,甚至“在哪里”共享指针。主界面如下所示: var ( storage

我试图实现的是在多个函数之间共享db.sqlx指针,除了说沿着指针传递的帖子,这很好,但是如何在接口中实现呢?我在任何地方都找不到任何能说明这个用法的东西。基本上我有一个Datastore类型的接口。我还有实现数据存储类型的mysql和pgsql。接口本身工作正常,但问题是我正在尝试为*sqlx.DB创建一个连接函数,以便在实现的接口内的所有函数之间共享。我想问题是我把自己弄糊涂了,不知道如何在接口的函数之间共享指针,甚至“在哪里”共享指针。主界面如下所示:

var (
    storage Datastore
    db * sqlx.DB
)

type Datastore interface {
    Insert(db *sqlx.DB, table string, item DataItem) bool
    CheckEmpty(db *sqlx.DB, table string) bool
    FetchAll(db *sqlx.DB, table string) []DataItem
    DBInit(db *sqlx.DB)
    initDB()
}
在我实现的界面(简化的mysql示例)中,我有initDB函数,它如下所示:

type MySQLDB struct {
    config *config.Configuration
}


func (my *MySQLDB) initDB() {
    log.Println("Getting DB Connection")
    tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
    if err != nil {
        log.Println(err.Error())
    }
    db = tempdb
    defer db.Close()
}

func (my *MySQLDB) FetchAll(db *sqlx.DB, table string) []DataItem {
    dTable := []DataItem{}
    query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
    err := db.Select(&dTable, query)
    if err != nil{
        panic(err)
    }
    return dTable
}

在这一点上,我知道连接最初是打开的,但下一次调用函数时,我得到的db是关闭的错误。那么,我如何在函数之间正确地共享db连接,或者我真的必须在每个函数中运行打开的连接呢?

不要在initDB函数中调用延迟db.Close()。执行该函数后,db也将关闭!因此,当您调用方法时,将得到关闭错误。
可能需要重新设计界面,例如:

type Datastore interface {
    Insert(table string, item DataItem) bool
    CheckEmpty(table string) bool
    FetchAll(table string) []DataItem
    Close() error // call this method when you want to close the connection
    initDB()
}
您的MySQLDB工具现在看起来像:

type MySQLDB struct {
    config *config.Configuration
    db *sqlx.DB
}


func (my *MySQLDB) initDB() {
    log.Println("Getting DB Connection")
    tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
    if err != nil {
        log.Println(err.Error())
    }
    my.db = tempdb
}

func (my *MySQLDB) Close() error {
    return my.db.Close()
}

func (my *MySQLDB) FetchAll(table string) []DataItem {
    dTable := []DataItem{}
    query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
    err := my.db.Select(&dTable, query)
    if err != nil{
        panic(err)
    }
    return dTable
}

感谢您在这方面的帮助。在
Close
中,应该是
my.db.Close()