我有一个SQL指针(*sql.DB
),需要在各个包之间共享。
例如:
"./main.go
" 有一个全局变量 "db
",需要与 "./another/package.go
" 中的一个包共享。
如何在不传递函数参数的情况下实现变量共享呢?
Db *sql.DB
),你就可以通过其完整名称在另一个包中访问它。package.name.Db
参见 "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
}
// 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
应该只是其他软件包的入口点,并尽量避免自己消耗东西。