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

Compilation 为什么Go编译版本相对较大?,compilation,go,Compilation,Go,我最近安装了go,并正在尝试hello world示例 package main import "fmt" func main() { fmt.Printf("hello, world\n") } $go构建hello.go 返回大小为1.2Mb的hello二进制文件。这对于一个hello world项目来说是相当大的。为什么文件大,有什么特别的原因吗?是否因为导入了“fmt”?是的,包“fmt”是原因之一。它还反过来导入其他包。但即使不使用“fmt”,整个运行时也会静态链接到Go二进

我最近安装了go,并正在尝试hello world示例

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

返回大小为1.2Mb的hello二进制文件。这对于一个hello world项目来说是相当大的。为什么文件大,有什么特别的原因吗?是否因为导入了“fmt”?

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

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

这是

为什么我的小程序是这么大的二进制文件?

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

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

这是

为什么我的小程序是这么大的二进制文件?

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

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


它静态编译所有未压缩的依赖项。想象一下部署的简单性吧!它静态编译所有未压缩的依赖项。想象一下部署的简单性吧!