为了账号安全,请及时绑定邮箱和手机立即绑定

将变量传递给 Golang 包

将变量传递给 Golang 包

Go
守着星空守着你 2021-10-18 09:49:51
给定一个包含以下局部变量和函数的包:var bucket *gocb.Bucketfunc 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在应用程序启动时实例化。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


import "my/other/pkg"


var bucket = pkg.InitBucket()

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


一般来说,如果您有这种想法,IoC不适用于 Go 包。


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信