英文:
Export functions from internal package in Go
问题
我正在测试将大部分代码放在一个internal
包中,然后选择性地将其中的方法/类型暴露给外部世界。代码看起来像这样:
/mypackage/internal/catapult
package catapult
func Load(boulder Boulder) {
// ...
}
func Trigger() *Launch {
// ...
}
// ...
也许Load
被其他内部包(/mypackage/internal/randomevents/boredsoldier
和/mypackage/internal/actualattackstrategy
)调用,但不应该被internal
以外的用户调用。所有这些包只允许在加载弹弓后触发它。
现在,我想在internal
上面有一个包(/mypackage/general
),其中Trigger
被公开,但Load
不被公开。我希望能做到这样:
package general
const TriggerCatapult = catapult.Trigger
// ^ 这样做不起作用,因为函数不能是常量
var TriggerCatapult = catapult.Trigger
// ^ 从技术上讲可以工作,但现在 TriggerCatapult 的值可以被任何包的用户覆盖
func TriggerCatapult() *catapult.Launch {
return catapult.Trigger()
}
// ^ 这样可以工作。只是每次都要重新编写整个函数的签名有点“痛苦”
有更好的方法吗?
英文:
I'm testing the idea of putting most of my code in an internal
package and then picking exactly which of the methods / types from there I'm exposing to the outside world. Code would look like:
/mypackage/internal/catapult
package catapult
func Load(boulder Boulder) {
// ...
}
func Trigger() *Launch {
// ...
}
// ...
Maybe Load
is being called by other internal packages (/mypackage/internal/randomevents/boredsoldier
and /mypackage/internal/actualattackstrategy
) but shouldn't be allowed by users outside of internal
. All those are allowed to do is Trigger
the catapult once it's loaded.
So now I'd like to have a package above internal
(/mypackage/general
) where Trigger
is exposed but not Load
. I was hoping to do something like:
package general
const TriggerCatapult = catapult.Trigger
// ^ does not work because a function cannot be a const
var TriggerCatapult = catapult.Trigger
// ^ technically works but now the value of TriggerCatapult can be overwritten by any package user
func TriggerCatapult() *catapult.Launch {
return catapult.Trigger()
}
// ^ works. It's just "painful" to have to reproduce the entire function's signature every time
Is there a better way to do this?
答案1
得分: 1
不,你提供的方式是没有更好的方法来做这个的:
func TriggerCatapult() *catapult.Launch {
return catapult.Trigger()
}
不过,你不应该返回未导出的类型,大多数代码检查工具会为你捕捉到这个问题。
如果用户要直接与catapult
中的内容进行交互,那么该包就不应该是内部的。
英文:
No, there is no better way to do this that the way you provide:
func TriggerCatapult() *catapult.Launch {
return catapult.Trigger()
}
You shouldn't return unexported types though, and most linters would catch this for you.
If a user is going to interact directly with things in catapult
, then that package should not be internal.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论