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

时间:2019-02-17 20:48:40

标签: go package private-methods

免责声明:是的,我知道这不是“应该完成”,“使用界面组合和委派”以及“语言的作者更好地了解”。但是,我面临的选择是从标准库中复制粘贴并创建自己的包,或者执行我要的操作。因此,请不要回答“您想做的事是错误的,您是一个糟糕的开发人员,应该感到难过。”

因此,在Go中,我们有http stdlib软件包。该程序包具有许多用于处理HTTP Range标头和响应的功能(解析器,“偏移量+大小”的结构等)。由于各种原因,我想使用与ServeContent非常相似的东西,但工作方式却有所不同(长话短说-做ReaderAt体操所需的管道数量对于我要完成的工作而言不是最佳的),因此我想使用Range stdlib包中的实用程序函数/结构自己解析HTTP http头,然后手动处理它们。基本上,我想更改ServeContent的版本:-)

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

如果Go标准库中有一个名为foo的程序包,但是它仅公开了一个MagicMegamethod来执行我不需要的事情,并使用了usefulFunc和{{1 }}我想获得访问权,我有办法获得这些标识符吗?通过重新打开软件包或使用其他方式...这无需在没有测试等情况下从stdlib复制粘贴数十行。

1 个答案:

答案 0 :(得分:3)

存在(rather gruesome)种访问未导出符号的方法,但是它需要大量琐碎的代码,因此不太可能获得净赢。

由于您否定了“不要这样做”的指示,因此答案似乎是否定的,或者使用我链接到(and this repo)的帖子中描述的方法。

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