2 回答

TA貢獻1884條經(jīng)驗 獲得超4個贊
只要全局變量被導出(意思是它的名字以大寫字母: 開頭Db *sql.DB),你就可以通過它的全名在另一個包中訪問它:
package.name.Db
但是全局變量的替代方案是依賴注入,就像使用注入框架來初始化正確的數(shù)據(jù)庫一樣。
參見“使用 Go 進行依賴注入”:
該inject庫是這項工作和我們的解決方案的結(jié)果。
它使用struct標簽來啟用注入,為具體類型分配內(nèi)存,并支持接口類型的注入,只要它們是明確的。
它還具有一些不太常用的功能,例如命名注入。粗略地說,我們上面的簡單示例現(xiàn)在看起來像這樣:
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
}

TA貢獻1871條經(jīng)驗 獲得超8個贊
VonC 問題的替代方法是提供一個構(gòu)造函數(shù) - 例如
// 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
}
使用構(gòu)造函數(shù)來初始化包的要求和/或傳入預初始化的對象通常是一種很好的做法 - 例如datastore.NewFromExisting(db)傳入你已經(jīng)創(chuàng)建的池。
在可能的情況下,您package main應該只是其他包的入口點,并應盡量避免自己使用東西。
- 2 回答
- 0 關注
- 180 瀏覽
添加回答
舉報