如何编写一个包装库的 Go 包,以便对重写函数的调用使用我的实现,并且非重写函数“落入”我正在包装的库中?
特别是:我希望我的 Go 包包装 ,除了我最初只想替换 和 ,并保持所有其他功能相同。我的库是现有代码的直接替代品,它调用我不会覆盖的其他函数。例如,我希望能够做到:net/httphttp.FileServerhttp.NotFoundHandlernet/http
package main
import (
"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
慕村225694
MMTTMM
相关分类