【问题标题】:Passing Variables to a Golang Package将变量传递给 Golang 包
【发布时间】:2015-06-11 19:01:53
【问题描述】:

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

var bucket *gocb.Bucket

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

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

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

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

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

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

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

【问题讨论】:

    标签: go singleton


    【解决方案1】:

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

    import "my/other/pkg"
    
    var bucket = pkg.InitBucket()
    

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

    一般来说,IoC 不适用于 Go 包,如果这是您的想法的话。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 2011-08-21
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2015-06-15
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多