我的应用程序中是否包括所有导入的go模块?

我的应用程序中是否包括所有导入的go模块?,go,Go,我的应用程序中是否包含导入的Go包中的所有内容,还是丢弃了未使用的代码?类似于Javascript的“树纹”吗 例如,如果我为自己创建了处理Gin和Gorm(或其他第三方功能)的实用程序函数,那么将我的实用程序函数也打包在单独的库中还是将它们捆绑在一个库中是有意义的 我的应用程序中是否包含了导入的Go模块的所有内容,或者是否包含了一些“树形图”,并且只包含了使用过的代码 首先,您不能在Go中导入模块。您只能导入包 其次,Go是一种语言规范,因此是否使用“树摇动”或任何其他消除死代码的方法的问题取

我的应用程序中是否包含导入的Go包中的所有内容,还是丢弃了未使用的代码?类似于Javascript的“树纹”吗

例如,如果我为自己创建了处理Gin和Gorm(或其他第三方功能)的实用程序函数,那么将我的实用程序函数也打包在单独的库中还是将它们捆绑在一个库中是有意义的

我的应用程序中是否包含了导入的Go模块的所有内容,或者是否包含了一些“树形图”,并且只包含了使用过的代码

首先,您不能在Go中导入模块。您只能导入包

其次,Go是一种语言规范,因此是否使用“树摇动”或任何其他消除死代码的方法的问题取决于实现

但话说回来,一般来说,官方的Go编译器,可能还有其他任何Go编译器,都足够聪明,不会包含明显未使用的东西。在这方面,它到底有多聪明取决于具体的实现和版本

如果我为自己创建了处理Gin和Gorm的实用函数,那么将这些函数放在两个单独的库中有意义吗

在单个库中是否有意义取决于您如何组织库。以逻辑方式组织库,而不是根据编译器优化。信任编译器完成它的工作

我可能不会将Gin和Gorm的实用函数放在同一个库中,只是因为它们之间根本不相关。但这与消除编译器中的死代码完全无关。

“树抖动”是针对JavaScript的,在JavaScript中,您以源代码的形式将代码交付到运行时,删除源代码中未使用的部分需要积极的努力(以一种结果仍然有效的方式进行,需要一些智能分析)

在编译语言中,尤其是在使用静态链接(Go几乎总是这样)时,不在未使用的函数中链接只是。。。如果没有任何东西引用函数,那么就没有理由发出它。这几乎是默认行为。链接器必须知道所有调用的位置以插入正确的地址,因此它不必做大量额外的工作来注意函数何时从未被调用

如果我为自己创建了处理Gin和Gorm的实用函数,那么将这些函数放在两个单独的库中有意义吗?或者,即使我的应用程序没有DB部分,将它们放在1个库中并导入Gorm实用程序函数(以及Gorm依赖项)是否完全无害


仅仅从依赖性的角度来看,将它们放在一个库中是一个愚蠢的想法。如果一个程序使用您的库,但从未使用过gorm,那么为什么它在构建过程中需要gorm?为什么获取或构建gorm的失败有可能破坏从未使用gorm的程序的构建?您没有支付运行时或二进制大小的成本,而是支付可维护性成本。

1。无法导入模块。只能导入包。2.任何导入包中的任何内容要么在最终二进制文件中着陆,要么由于未使用而被链接器剥离。3.构建要求提前解析依赖项(阅读“下载”),并且要求下载gorm及其所有依赖项以不包含在二进制文件中可能是浪费,但没有任何规则。我只使用“树抖动”作为通用术语,用于不包含所有代码,只包含必要的部分。DB库部分也是一个任意的例子,用来找出组织库的最佳方法。一些开发人员刚刚将所有内容添加到一个库中,看起来很粗略。谢谢,你的回答正是我想知道的