在 Go 中使用 stdlib 中未导出的函数/类型

免责声明:是的,我知道这不是“应该做的”和“使用接口组合和委托”和“语言的作者更清楚”。然而,我面临着从标准库中复制粘贴并创建我自己的包,或者按照我的要求做的选择。所以请不要回复“你想做的是错误的,你是一个糟糕的开发者,你应该感到难过”。

所以,在 Go 中我们有httpstdlib 包。这个包有许多处理 HTTP Range 标头和响应的函数(解析器,“偏移量+大小”的结构等等)。出于各种原因,我想使用一些非常相似ServeContent但工作方式有点不同的东西(长话短说 - 做体操所需的管道数量ReaderAt对于我想要完成的事情来说不是最佳的)所以我想Range自己解析 HTTP 标头,使用 stdlib 包中的实用函数/结构http,然后手动处理它们。ServeContent基本上,我想要:-)的更改版本

有没有办法让我“重新打开” httpstdlib 包以使用它的未导出标识符?ABI 对我来说不是问题,因为源是我的,程序每次都是从头开始编译等等,它不需要与旧版/其他 Go 版本的二进制兼容性。即我能够确保构建将在特定的 Go 版本上完成,并且有测试来检查未导出的标识符是否消失。所以...

如果有一个foo在 Go 标准库中调用的包,但它只公开了一个MagicMegamethod我不需要的东西,并且使用了usefulFuncusefulStruct想要访问的东西,我有没有办法访问这些标识符?通过重新打开包,或使用其他方式......不涉及从 stdlib 复制粘贴数十行而不进行测试等。


DIEA
浏览 105回答 1
1回答

HUH函数

存在(相当可怕的)访问未导出符号的方法,但它需要大量的棘手代码,因此不太可能获得净胜利。FWIW 我个人只是从标准库中复制我需要的代码并根据我的需要进行调整。
打开App,查看更多内容
随时随地看视频慕课网APP