我最近安装了 go 并尝试了 hello world 示例。
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
$ 去构建 hello.go
返回 1.2Mb 大小的 hello 二进制文件。这对于一个 hello world 程序来说是相当大的。关于为什么文件大小很大的任何特殊原因?是因为导入“fmt”吗?
我最近安装了 go 并尝试了 hello world 示例。
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
$ 去构建 hello.go
返回 1.2Mb 大小的 hello 二进制文件。这对于一个 hello world 程序来说是相当大的。关于为什么文件大小很大的任何特殊原因?是因为导入“fmt”吗?
这是一个围棋常见问题
为什么我的小程序是这么大的二进制文件?
gc 工具链中的链接器(5l、6l 和 8l)执行静态链接。因此,所有 Go 二进制文件都包含 Go 运行时,以及支持动态类型检查、反射甚至恐慌时堆栈跟踪所需的运行时类型信息。
在 Linux 上使用 gcc 静态编译和链接的简单 C“hello, world”程序大约 750 kB,包括 printf 的实现。使用 fmt.Printf 的等效 Go 程序大约为 1.2 MB,但其中包括更强大的运行时支持。
是的,包“fmt”是原因之一。它还反过来导入其他包。但即使不使用“fmt”,整个运行时也会静态链接到 Go 二进制文件中。Go 的运行时并不是一个简单的运行时——它包括例如调度程序/goroutine 与 OS 线程管理器、拆分堆栈分配器、垃圾收集器和垃圾收集器友好的内存分配器(也是 C 线程友好的)、信号处理程序和堆栈跟踪生成器。 ..