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

如何包装一个只有少量修改的Go包?

如何包装一个只有少量修改的Go包?

Go
BIG阳 2022-08-24 20:20:04
如何编写一个包装库的 Go 包,以便对重写函数的调用使用我的实现,并且非重写函数“落入”我正在包装的库中?特别是:我希望我的 Go 包包装 ,除了我最初只想替换 和 ,并保持所有其他功能相同。我的库是现有代码的直接替代品,它调用我不会覆盖的其他函数。例如,我希望能够做到:net/httphttp.FileServerhttp.NotFoundHandlernet/httppackage mainimport (    "log"    http "github.com/jstrieb/my-special-http-lib")func main() {    http.ListenAndServe(                            // Use the net/http ListenAndServe by "falling through" my library        ":8080",         http.FileServer(http.Dir("/usr/share/doc")) // Use my custom, overridden http.FileServer    )}我尝试过什么我可以手动覆盖包装库导出的每个函数(如下所示),但如果可能的话,我宁愿避免这种情况。这种方法是不可取的,因为它没有考虑从我正在包装的库中调用我覆盖的函数的实例。func ExportedFunction(input1 type1) type2 {    return http.ExportedFunction(input1)}我也可以完全分叉net/ http源代码并直接更改它,但我希望它清楚我所做的更改,而不必与原始版本进行比较。维护标准库的一部分分支以仅覆盖几个函数也是没有意义的。理由我不是在寻找关于这是否是一个“好”想法的评论。我只想知道该怎么做。此库的计划是简单地更改 404 页面和目录列表索引页的外观。这种纯粹的美学变化不会影响 的基础功能或 API。如果它的结构不是包装所有 ,那么用户将不得不在使用两个包之间切换以执行相同的操作。然后,我的库不能被视为已经使用 的代码的“直接替换”。net/httpnet/httpnet/http我也打算随着时间的推移覆盖更多的函数,但我的库的API将始终与.这样做可以减少手动替换调用的需要,就像每次库更改时一样。此外,我希望能够在我没有编写的代码(使用)中导入我的替换,并且不想手动重构。net/httphttp.Functionmylibrary.Functionnet/http
查看完整描述

2 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

您在这里尝试实现的是扩展包的功能。这里的简单答案是,到目前为止,您还不能这样做。实现这一目标的最佳方法是手动执行此操作。
就个人而言,我认为将两个包分开没有任何害处。我这个它更易于维护。只需包装要更新的函数即可。有时,您所需要的只是一个函数。

查看完整回答
反对 回复 2022-08-24
?
MMTTMM

TA贡献1869条经验 获得超4个赞

不是 Go 专家,但从轶事上讲,如果通过指定一个依赖项,然后您可以使用所需的任何修改来旁加载其不同版本,这将引入一个重大漏洞

它可能会说出这样一个概念,如果这个依赖关系是你可以带入应用程序的东西,那么你应该构建一个基于你想要修改的库的库,并导入。也就是说,给定您的应用程序 A 和库 B,以及您修改后的库 B',您可能希望编写应用程序,以便 A 依赖于 B',而 B 依赖于 B,这将使关系变得明显。如果你想以某种方式让A依赖于B,但能够动态地旁加载B',那么这将代表我之前提到的漏洞。


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

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