将变量传递给 Golang 包
Passing Variables to a Golang Package
给定包含以下局部变量和函数的包:
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
。
在 Go 中,如果你的包 depends 依赖于你 import 外部的东西。因此,除非由于某种原因不可能,否则您应该导入实例化 bucket
的包并从那里获取它,直接分配它或在包的 init
函数中。
import "my/other/pkg"
var bucket = pkg.InitBucket()
但是,如果无法确定将提供什么包 bucket
,那么您的方式就是 Go 方式。例如,请考虑 database/sql
,其中 SQL 驱动程序必须先注册才能使用。
一般来说,IoC 不适用于 Go 包,如果您想要的话。
给定包含以下局部变量和函数的包:
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
。
在 Go 中,如果你的包 depends 依赖于你 import 外部的东西。因此,除非由于某种原因不可能,否则您应该导入实例化 bucket
的包并从那里获取它,直接分配它或在包的 init
函数中。
import "my/other/pkg"
var bucket = pkg.InitBucket()
但是,如果无法确定将提供什么包 bucket
,那么您的方式就是 Go 方式。例如,请考虑 database/sql
,其中 SQL 驱动程序必须先注册才能使用。
一般来说,IoC 不适用于 Go 包,如果您想要的话。