为什么Go会为小程序生成大的二进制文件?

sep*_*oad 4 size binary go

为什么Go编译器会产生大的二进制文件?

例如,在编译下面的代码后,我得到一个1.8 MB的exec文件

package main
import "fmt"
func main(){
   fmt.Println("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

我在UbuntuWin7上测试了上面的代码,结果是一样的!

我还用+70行代码编写了一个更大的程序,结果二进制文件又惊人地1.8 MB(实际上有几个字节差异).我想知道Go编译器将什么转储到二进制文件中.

use*_*740 13

为什么我的琐碎程序如此大的二进制文件?(来自Go Programming Language FAQ):

gc工具链(5l,6l和8l)中的接头进行静态连接.因此,所有Go二进制文件都包括Go运行时,以及支持动态类型检查,反射甚至恐慌时间堆栈跟踪所需的运行时类型信息.

在Linux上使用gcc静态编译和链接的简单C"hello,world"程序大约为750 kB,包括printf的实现.使用fmt.Printf的等效Go程序大约为1.2 MB,但这包括更强大的运行时支持.

  • 暗示:由于2MB来自大量运行时/标准库中的链接,因此二进制大小与您编写的代码数量不成比例 - 如果您编写10x或100x Hello World,则通常不会获得18MB或180MB二进制. (5认同)
  • 如果目标设备不能使用2MB二进制文件,则可能无法使用Go.如果使用`-compiler gccgo`构建,它会将一些标准库推送到设备上所有Go二进制文件共享的`libgo`,但无论如何,你的程序需要该代码并且它会在某处占用空间(就像说,Java和C#需要在目标机器上安装它们的运行时). (3认同)