将变量传递给 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 包,如果您想要的话。