给定包含以下局部变量和函数的包:
var bucket *gocb.Bucket
func Init(b *gocb.Bucket) {
bucket = b
}
func DoSomething() {
// do something with 'bucket'
}在调用依赖于Init变量的DoSomething之前,调用bucket的一个实例调用bucket函数可以接受吗?
或者,如果DoSomething显式地接受bucket参数,如下所示:
func DoSomething(bucket *gocb.Bucket) {
// do something with 'bucket'
}我更愿意在包级别实例化bucket的单个实例,并在整个应用程序生命周期中使用它,而不是在函数级别进行管理。从设计、性能等角度来看,这是可以接受的,还是有一种更好的方法来实现这一点?请记住,bucket只需要实例化一次。
DoSomething将从HTTP上下文中调用;我希望HTTP处理程序在bucket参数上不具有可见性,而是在应用程序启动时实例化bucket。
发布于 2015-06-11 11:01:53
在Go中,如果您的包依赖于外部的东西,则需要导入所述的东西。因此,除非出于某种原因不可能,否则您应该导入实例化bucket的包,并从中获取它,直接分配它或在包的init函数中。
import "my/other/pkg"
var bucket = pkg.InitBucket()但是,如果不可能确定提供bucket的包,那么您的方式就是要走的路。例如,考虑database/sql,其中必须注册SQL驱动程序才能使用它们。
通常,如果您的想法是这样的话,IoC不适用于Go包。
https://stackoverflow.com/questions/30778425
复制相似问题