所以我有一個SQL指針(*sql.DB
),它需要在整個包中共享。在整個包中共享全局變量
例如:
「./main.go
」具有全局變量「db
」需要被在「./another/package.go
」與包共享。
如何在不傳遞函數參數的情況下實現共享變量? ,你可以通過它的全名訪問另一個包:
package.name.Db
但替代全局變量:
所以我有一個SQL指針(*sql.DB
),它需要在整個包中共享。在整個包中共享全局變量
例如:
「./main.go
」具有全局變量「db
」需要被在「./another/package.go
」與包共享。
如何在不傳遞函數參數的情況下實現共享變量? ,你可以通過它的全名訪問另一個包:
package.name.Db
但替代全局變量:
只要全局變量輸出(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
}
到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
應該只是其他軟件包的入口點,應儘量避免自行消耗。