将变量传递给Golang包

Pau*_*ney 2 singleton go

给定一个包含以下局部变量和函数的包:

var bucket *gocb.Bucket

func Init(b *gocb.Bucket) {
    bucket = b
}

func DoSomething() {
    // do something with 'bucket'
}
Run Code Online (Sandbox Code Playgroud)

是否可以调用Init函数,bucket在调用之前传入一个实例DoSomething,这取决于bucket变量?

或者,应该DoSomething明确地接受一个bucket参数,如下所示:

func DoSomething(bucket *gocb.Bucket) {
    // do something with 'bucket'
}
Run Code Online (Sandbox Code Playgroud)

我宁愿bucket在包级别实例化一个实例,并在整个应用程序生命周期中使用它,而不是在函数级别进行管理.从设计,性能等角度来看,这是否可以接受,或者是否有实现这一目标的首选方法?请记住,bucket只需要实例化一次.

DoSomething将从HTTP上下文调用; 我希望HTTP处理程序不具有bucket参数的可见性,而是bucket在应用程序启动时实例化.

thw*_*hwd 5

在Go中,如果你的包依赖于外部的东西你导入所说的东西.因此,除非由于某种原因不可能,否则您应该导入实例化的包bucket并从那里获取,直接分配它或在包的init功能中.

import "my/other/pkg"

var bucket = pkg.InitBucket()
Run Code Online (Sandbox Code Playgroud)

但是,如果无法确定将提供哪个软件包bucket,那么您的方式就是Go.例如,考虑database/sql在使用SQL驱动程序之前必须注册的位置.

一般来说,IoC不适用于Go包,如果这是你的想法.