给定一个包含以下局部变量和函数的包:var bucket *gocb.Bucketfunc Init(b *gocb.Bucket) { bucket = b}func DoSomething() { // do something with 'bucket'}在调用依赖于变量Init的bucket, 之前调用函数,传入 , 的实例是否可以接受?DoSomethingbucket或者,应该DoSomething显式接受一个bucket参数,如下所示:func DoSomething(bucket *gocb.Bucket) { // do something with 'bucket'}我更愿意bucket在包级别实例化单个实例,并在整个应用程序生命周期中使用它,而不是在功能级别进行管理。从设计、性能等角度来看,这是否可以接受,或者是否有实现这一目标的首选方法?请记住,bucket只需实例化一次。DoSomething将从 HTTP 上下文中调用;我希望 HTTP 处理程序在bucket参数上没有可见性,而是bucket在应用程序启动时实例化。
1 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
在 Go 中,如果你的包依赖于外部的东西,你导入所说的东西。因此,除非由于某种原因不可能,否则您应该导入实例化的包bucket并从那里获取它,直接分配它或在包的init函数中。
import "my/other/pkg"
var bucket = pkg.InitBucket()
但是,如果无法确定将提供什么包bucket,那么您的方法就是 Go。例如,考虑database/sql在 SQL 驱动程序可以使用之前必须注册的位置。
一般来说,如果您有这种想法,IoC不适用于 Go 包。
- 1 回答
- 0 关注
- 141 浏览
添加回答
举报
0/150
提交
取消