我的应用程序中是否包含导入的 Go 包中的所有内容,或者未使用的代码是否被丢弃?类似于 Javascript 的“treeshaking”?
例如。如果我为自己创建了处理 Gin 和 Gorm(或其他一些第三方功能)的实用函数 - 将我的实用函数也打包在单独的库中或将它们捆绑在一个库中是否有意义?
“Tree-shaking”适用于 JavaScript,其中您以源代码形式将代码交付给运行时,并且删除源代码中未使用的部分需要积极的努力(并且以结果仍然有效的方式这样做需要一些智能分析) 。
在编译语言中,特别是在使用静态链接时(Go 几乎总是这种情况),不链接未使用的函数就是这样……如果没有任何东西引用函数,那么就没有理由发出它。这几乎是默认行为。链接器必须知道所有调用的位置才能插入正确的地址,因此它不必做大量的额外工作来注意到函数何时从未被调用。
例如。如果我为自己创建了处理 Gin 和 Gorm 的实用函数 - 将这些函数放在 2 个独立的库中是否有意义?或者,即使我的应用程序没有数据库部分,将它们放在 1 个库中并导入 Gorm 实用函数(以及 Gorm 依赖项)是完全无害的吗?
仅从依赖关系的角度来看,将它们放在一个库中是一个愚蠢的想法。如果一个程序使用您的库,并且从不使用 gorm,那么为什么它在构建过程中需要 gorm 呢?为什么获取或构建 gorm 失败有可能破坏从未使用它的程序的构建?您无需支付运行时或二进制大小的成本,而是支付可维护性成本。
我的应用程序中是否包含导入的 Go 模块中的所有内容,或者是否涉及一些“treeshaking”并且仅包含使用的代码?
首先,你不能在 Go 中导入模块。您只能导入包。
其次,Go 是一种语言规范,因此是否使用“tree-shaking”或任何其他消除死代码的方法的问题取决于实现。
但话虽如此,一般来说,官方的 Go 编译器,可能还有任何其他 Go 编译器,都足够聪明,不会包含明显不使用的东西。它在这方面到底有多智能取决于具体的实现和版本。
如果我为自己创建了处理 Gin 和 Gorm 的实用函数 - 将这些函数放在 2 个独立的库中是否有意义?
位于单个库中是否有意义取决于您如何组织库。按逻辑方式组织库,而不是根据编译器优化。相信编译器会完成它的工作。
我可能不会将 Gin 和 Gorm 的实用函数放在同一个库中,只是因为它们彼此完全不相关。但这与编译器的死代码消除完全无关。