为什么Go编译版本相对庞大?

时间:2013-03-10 18:20:06

标签: compilation go

我最近安装了go并尝试了hello world示例。

package main
import "fmt"
func main() {
    fmt.Printf("hello, world\n")
}
  

$ go build hello.go

返回大小为1.2Mb的hello二进制文件。这对于一个你好的世界计划来说相对来说是巨大的。有什么特别的原因,为什么文件大小?是因为导入“fmt”?

2 个答案:

答案 0 :(得分:5)

这是a Go FAQ

为什么我的琐碎程序是如此大的二进制文件?

  

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

     

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

答案 1 :(得分:1)

是的,包“fmt”是其中一个原因。它还反过来导入其他包。但即使不使用“fmt”,也会将整个运行时静态链接到Go二进制文件中。 Go的运行时并不简单 - 它包括例如调度程序/ goroutine vs OS线程管理器,拆分堆栈分配器,垃圾收集器和垃圾收集器友好的内存分配器,它也是C线程友好,信号处理程序和堆栈跟踪生成器,。 ..