将变量传递给 Golang 包

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


var bucket *gocb.Bucket


func 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在应用程序启动时实例化。


守着星空守着你
浏览 142回答 1
1回答

牧羊人nacy

在 Go 中,如果你的包依赖于外部的东西,你导入所说的东西。因此,除非由于某种原因不可能,否则您应该导入实例化的包bucket并从那里获取它,直接分配它或在包的init函数中。import "my/other/pkg"var bucket = pkg.InitBucket()但是,如果无法确定将提供什么包bucket,那么您的方法就是 Go。例如,考虑database/sql在 SQL 驱动程序可以使用之前必须注册的位置。一般来说,如果您有这种想法,IoC不适用于 Go 包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go