如果我的项目中完全没有使用外部包中的某个函数,那么编译器会从生成的机器代码中删除该函数吗?这个问题通常适用于任何语言的编译器。但是,我认为不同语言的行为可能有所不同。因此,我想知道go编译器的做法。我希望能够理解这个问题,感谢您的帮助。
语言规范中没有提到这一点,从正确性的角度来看,这是不相关的。但需要知道的是,当前版本确实删除了编译器可以证明未使用且不会更改应用程序运行时行为的某些结构。引用自Go Blog: Smaller Go 1.7 binaries中的一段话:第二个变化是方法修剪。在1.6之前,所有已使用类型的所有方法都被保留,即使有些方法从未被调用。这是因为它们可能通过接口进行调用,或者使用reflect包动态调用。现在,编译器会丢弃任何不匹配接口的未公开方法。同样,如果程序中没有使用对应的反射功能,链接器可以丢弃其他仅通过反射访问的导出方法。该更改将使二进制文件缩小5-20%。方法比函数更“难”处理,因为方法可以通过反射列出和调用(不像函数),但Go工具尽力删除未使用的方法。您可以在此答案中查看已删除/未链接代码的示例和证明: 如何在编译时删除未使用的代码? 还可以查看其他相关问题: 拆分客户端/服务器代码 在Golang中调用所有具有特殊前缀或后缀的函数