回答

收藏

Go 编译后的可执行文件的原因

技术问答 技术问答 259 人阅读 | 0 人回复 | 2023-09-12

我编译了一个 hello world Go 程序,它在我的 linux 本机可执行文件生成在机器上。但我惊讶地看到了简单的 Hello world Go 程序的大小是 1.9MB !
& _, E& P: N. V/ l# X为什么这么简单Go程序的可执行文件这么大?5 d  F$ J( t5 y# v# Q6 @6 b$ h
                                                               
  x- a3 }. @) M    解决方案:                                                                1 k4 C4 O1 Q: v: y) t6 ?4 [1 E
                                                                引用答案:
9 a& m, T+ b$ v4 r5 A在GC工具链(连接体5)l,6l和8l)做静态链接。因此,所有 Go 二进制文件包含  Go 运行时,以及支持动态类型检查、反射甚至恐慌时堆栈跟踪所需运行时的类型信息。' p' g' V4 K6 {
在 Linux 上使用 gcc 简单的静态编译和链接 C“hello,world程序大约 750 kB,包括printf. 使用等效 Go 程序fmt.Printf大约为 1.9 MB,但这包括更强大的运行支持和类型信息。
) F0 u% z  E: U$ ]0 [/ S- B6 {所以,你的 Hello World 本机可执行文件为 1.9 MB,因为它包含垃圾收集、反射和许多其他功能(你的程序可能不会真正使用它,但它就在那里)。fmt用于打印"Hello World"实现文本包(及其依赖项)。
2 z% w: j6 Q0 }+ h/ c$ Q. U现尝试以下操作:fmt.Println("Hello World! Again")将另一行添加到您的程序中并再次编译。结果不是 2x 1.9MB,但还是只有 1.9MB!是的,因为所有使用的库(fmt及其依赖项)和操作已添加到可执行文件中(所以只添加几个字节来打印你刚添加的第二个文本)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则