Go 包通常由多个模块或程序使用。尽管只需要一小部分功能,但整个包最终可以被编译到每个可执行文件中。这可能会导致生成包含未使用的函数和字符串的大型二进制文件。
不幸的是,与其他一些编程语言不同,Go 目前不提供在编译时显式删除未使用代码的方法。编译器在某种程度上优化并删除了无法访问的代码,但它无法确定可能可达的未使用代码,即使它从未显式调用。
可以使用以下代码演示此行为:
// play/subplay.go package subplay func A() { fmt.Printf("this is function A()") } func B() { fmt.Printf("secret string") }
在主模块中,我们导入了 subplay 包,但只调用了函数 A():
// main.go package main import "play/subplay" func main() { subplay.A() }
尽管如此B() 从未被调用,字符串“秘密字符串”仍然包含在生成的二进制文件中。
正如对此问题的答复中所述,一种解决方法是注意导入包引入的依赖项。例如,导入 net/http 还将导入 39 个其他包,这会显着增加二进制大小,即使没有使用这些包。
虽然编译器可能无法删除未使用的代码,但它优化代码以提高效率仍然至关重要。避免不必要的函数调用、保持数据结构精简以及最小化字符串分配都有助于减少二进制大小。
以上是如何在编译时删除 Go 中未使用的代码?的详细内容。更多信息请关注PHP中文网其他相关文章!