【发布时间】:2019-02-18 07:17:49
【问题描述】:
免责声明: 是的,我知道这不是“应该完成”、“使用界面组合和委托”以及“语言的作者更了解”。但是,我面临的选择是从标准库复制粘贴并创建自己的包,或者按照我的要求进行操作。所以请不要回复“你想做的事情是错误的,你是一个糟糕的开发者,你应该感到难过。”
所以,在 Go 中,我们有 http stdlib 包。这个包有许多处理 HTTP Range 头和响应的函数(解析器、“offset+size”的结构等等)。由于各种原因,我想使用与ServeContent 非常相似但工作方式略有不同的东西(长话短说 - 做ReaderAt 体操所需的管道数量对于我想要完成的事情来说不是最理想的)所以我想要自己解析 HTTP Range 标头,使用 http stdlib 包中的实用程序函数/结构,然后手动处理它们。基本上,我想要ServeContent 的更改版本:-)
有没有办法让我“重新打开”http stdlib 包以使用它的未导出标识符? ABI 对我来说不是问题,因为源是我的,程序每次都从头开始编译等等等等,它不需要与旧/其他 Go 版本的二进制兼容性。 IE。我能够确保构建将在特定的 Go 版本上完成,并且有测试来检查未导出的标识符是否消失。所以...
如果 Go 标准库中有一个名为 foo 的包,但它只公开了一个 MagicMegamethod 来做我不需要的事情,并使用我想要访问的 usefulFunc 和 usefulStruct to,有没有办法让我访问这些标识符?通过重新打开包,或使用其他方式......不涉及从 stdlib 复制粘贴数十行而不进行测试等。
【问题讨论】:
-
你对“复制粘贴几十行”有什么看法?你即将绕过 Go 的基本原则之一,你害怕重复几百行代码?相信我,复制更容易(而且您可以免费获得可移植性和向后/向前兼容性......)。
标签: go package private-methods