2015-11-12 84 views
3

所以我有一個SQL指針(*sql.DB),它需要在整個包中共享。在整個包中共享全局變量

例如:

./main.go」具有全局變量「db」需要被在「./another/package.go」與包共享。
如何在不傳遞函數參數的情況下實現共享變量? ,你可以通過它的全名訪問另一個包:

package.name.Db 

但替代全局變量:

回答

3

只要全局變量輸出(Db *sql.DB意味着它的名稱以大寫字母開頭)是依賴注入,如使用inject framework來初始化正確的db。

請參閱 「Dependency Injection with Go」:

inject庫是這項工作,我們的解決方案的結果。
它使用struct標記來啓用注入,爲具體類型分配內存,並且只要接口類型明確,就支持注入。
它也有一些不太經常使用的功能,如命名注入。粗略地說,我們上面簡單的例子,現在看起來是這樣的:

type AppLoader struct { 
    MongoService mongo.Service `inject:""` 
} 

func (l *AppLoader) Get(id uint64) *App { 
    a := new(App) 
    l.MongoService.Session().Find(..).One(a) 
    return a 
} 
0

到VonC的問題,另一種方法是提供一個構造 - 例如

// package datastore 
var db *sql.DB 

func NewDB(host, port string) (*sql.DB, error) { 
    // Simplified example 
    conn, err := sql.Open(...) 
    if err != nil { 
     return nil, err 
    } 

    db = conn 
    return conn, nil 
} 

// package main 
func main() { 
    db, err := datastore.NewDB("localhost", "5432") 
    if err != nil { 
     log.Fatal(err) 
    } 

    // Now you can use it here, and/or in your datastore package 
} 

這是典型地良好的做法是使用構造初始化包的要求,和/或通過在預初始化的對象 - 例如datastore.NewFromExisting(db)傳入您已創建的池中。

在可能的情況下,您的package main應該只是其他軟件包的入口點,應儘量避免自行消耗。

相關問題