将变量传递给Golang包

时间:2015-06-11 10:34:26

标签: go singleton

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

var bucket *gocb.Bucket

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

func DoSomething() {
    // do something with 'bucket'
}

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

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

func DoSomething(bucket *gocb.Bucket) {
    // do something with 'bucket'
}

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

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

1 个答案:

答案 0 :(得分:5)

在Go中,如果您的软件包依赖于外部的某些内容,则 import 表示该内容。因此,除非由于某种原因不可能,否则您应该导入实例化bucket并从那里获取的包,直接分配它或在包的init函数中。

import "my/other/pkg"

var bucket = pkg.InitBucket()

但是,如果无法确定将配置bucket的包,那么您的方式就是Go。例如,考虑database/sql,其中必须先注册SQL驱动程序才能使用它们。

一般情况下,IoC不适用于Go套餐,如果这是您的想法。