在 Go 中使用未导出的 functions/types from stdlib

Using unexported functions/types from stdlib in Go

免责声明: 是的,我知道这不是 "supposed to be done" 和 "use interface composition and delegation" 和 "the authors of the language know better"。但是,我面临着从标准库中选择 copy-pasting 并创建我自己的包,或者按照我的要求进行选择。所以请不要回复 "What you want to do is wrong, you are a bad dev and you should feel bad."

因此,在 Go 中我们有 http stdlib 包。这个包有很多处理 HTTP Range headers 和响应的函数(解析器,"offset+size" 的结构等等)。出于各种原因,我想使用与 ServeContent 非常相似但工作方式略有不同的东西(长话短说 - 进行 ReaderAt 体操所需的管道数量对于我想要完成的事情来说不是最佳选择) 所以我想自己解析 HTTP Range header,使用 http stdlib 包中的实用程序 functions/structs,然后手动处理它们。基本上,我想要 ServeContent 的更改版本 :-)

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

如果 Go 标准库中有一个名为 foo 的包,但它只暴露了一个 MagicMegamethod 做我不需要的事情,并使用 usefulFuncusefulStruct 我想访问,有没有办法让我访问这些标识符?通过重新打开包,或使用其他方式...不涉及 copy-pasting 来自 stdlib 的数十行未经测试等

存在 (rather gruesome) 种访问未导出符号的方法,但它需要大量的棘手代码,因此不太可能完全获胜。

既然你已经排除了 "don't do this" 方向,那么答案似乎是否定的,或者使用我链接到 (and this repo) 的 post 中描述的方法。

FWIW 我个人只是从标准库中复制我需要的代码并根据我的需要进行调整。这可能比你写这个 SO 问题花费的时间更少:-)