给定一个包含以下局部变量和函数的包:
var bucket *gocb.Bucket
func Init(b *gocb.Bucket) {
bucket = b
}
func DoSomething() {
// do something with 'bucket'
}
在调用Init
之前调用bucket
函数,传入DoSomething
的实例是否可以接受,这取决于bucket
变量?
或者,DoSomething
应该明确接受bucket
参数,如下所示:
func DoSomething(bucket *gocb.Bucket) {
// do something with 'bucket'
}
我更愿意在包级别实例化bucket
的单个实例,并在整个应用程序生命周期中使用它,而不是在功能级别进行管理。从设计,性能等角度来看,这是否可以接受,或者是否有实现这一目标的首选方法?请记住,bucket
只需要实例化一次。
DoSomething
将从HTTP上下文调用;我希望HTTP处理程序不具有bucket
参数的可见性,而是在应用程序启动时实例化bucket
。
答案 0 :(得分:5)
在Go中,如果您的软件包依赖于外部的某些内容,则 import 表示该内容。因此,除非由于某种原因不可能,否则您应该导入实例化bucket
并从那里获取的包,直接分配它或在包的init
函数中。
import "my/other/pkg"
var bucket = pkg.InitBucket()
但是,如果无法确定将配置bucket
的包,那么您的方式就是Go。例如,考虑database/sql
,其中必须先注册SQL驱动程序才能使用它们。
一般情况下,IoC不适用于Go套餐,如果这是您的想法。