将编译器忽略未使用的函数

Sid*_*han 3 executable go

如果在我的项目中根本没有使用外部包中的函数,编译器是否会从生成的机器代码中删除该函数?

这个问题可以针对任何语言编译器.但是,我认为这种行为可能因语言而异.所以,我有兴趣知道编译器会做什么.

理解这一点,我将不胜感激.

icz*_*cza 6

语言规范在任何地方都没有提到这一点,从正确的角度来看,这是无关紧要的.

但是要知道当前版本确实删除了编译器可以证明未使用的某些构造,并且不会更改应用程序的运行时行为.

引用Go Go博客:Smaller Go 1.7二进制文件:

第二个变化是方法修剪.直到1.6,所有使用类型的所有方法都被保留,即使从未调用过某些方法.这是因为它们可能通过接口调用,或使用反射包动态调用.现在,编译器会丢弃任何与接口不匹配的未导出方法.类似地,如果程序中的任何地方都没有使用相应的反射特征,则链接器可以丢弃其他导出的方法,这些方法只能通过反射访问.这种变化使二进制文件缩小了5-20%.

方法是比函数"更难"的情况,因为可以使用反射列出和调用方法(与函数不同),但Go工具甚至可以删除未使用的方法.

您可以在此答案中查看已删除/取消链接的代码的示例和证明:

如何在编译时删除未使用的代码?

另请参阅其他相关问题:

拆分客户端/服务器代码

在Golang中调用具有特殊前缀或后缀的所有函数