为了账号安全,请及时绑定邮箱和手机立即绑定

导入的围棋模块中的所有内容是否都包含在我的应用程序中?

导入的围棋模块中的所有内容是否都包含在我的应用程序中?

Go
慕雪6442864 2022-08-15 15:51:49
导入的 Go 包中的所有内容是否都包含在我的应用程序中,还是丢弃了未使用的代码?像Javascript的“树摇”这样的东西?例如。如果我为自己创建了处理Gin和Gorm(或其他一些第三方功能)的实用程序函数 - 将我的实用程序函数也打包在单独的库中还是将它们捆绑在一个库中是否有意义?
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

“Tree-shaking”适用于JavaScript,您将代码以源代码形式交付给运行时,并且删除源代码中未使用的位需要积极的努力(并且以结果仍然有效的方式执行此操作需要一些明智的分析)。

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

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

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


查看完整回答
反对 回复 2022-08-15
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

导入的Go模块中的所有内容是否都包含在我的应用程序中,还是涉及一些“树摇动”并且只包含使用的代码?

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

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

但话虽如此,一般来说,官方的Go编译器,可能还有任何其他Go编译器,都足够聪明,可以不包括明显未使用的东西。在这方面,它究竟有多聪明取决于确切的实现和版本。

如果我为自己创建了处理 Gin 和 Gorm 的实用程序函数 - 将这些函数放在 2 个单独的库中是否有意义?

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

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


查看完整回答
反对 回复 2022-08-15
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信