登录
首页 >  Golang >  Go问答

使用 Go 中未公开的标准库函数/类型

来源:stackoverflow

时间:2024-03-19 16:54:31 284浏览 收藏

Go语言的标准库包含了许多有用的函数和类型,但某些情况下需要使用未公开的标识符。然而,Go语言的ABI并不允许直接访问这些标识符。一种解决方案是重新编译标准库,但需要进行大量棘手的代码操作。另一种解决方案是复制所需的代码并根据需要进行修改。

问题内容

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

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

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

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


解决方案


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

既然您已经排除了“不要这样做”的指示,那么答案似乎是否定的,或者使用我链接到的帖子 (and this repo) 中描述的方法。

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

以上就是《使用 Go 中未公开的标准库函数/类型》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>