出于好奇,我使用HEX编辑器打开了GO编译器生成的二进制文件,令我惊讶的是,我在二进制文件中找到了项目中使用的每个源代码的完整路径和文件名。
就像,显然有/home/myusername/myprojectname/source.go这样的信息
更令我惊讶的是,我发现了一些特定功能如何工作的评论
现在我知道为什么用Golang编写的“Hello World”会编译生成一个3mb二进制文件...
有谁知道是否有办法从golang二进制文件中删除这些东西?比如,任何编译器标志?
我找到了像特定功能如何工作的评论
他们不是评论。它们是字符串文字,主要是错误消息。例如,
malloc.go: throw("persistentalloc: align is not a power of 2")
lfstack.go: print("runtime: lfstack.push invalid packing: node="
现在我知道为什么用Golang编写的“Hello World”会编译生成一个3mb二进制文件...
不,你没有。
Go: Frequently Asked Questions (FAQ)
Why is my trivial program such a large binary?
gc工具链中的链接器默认创建静态链接的二进制文件。因此,所有Go二进制文件都包含Go运行时,以及支持动态类型检查,反射甚至恐慌时间堆栈跟踪所需的运行时类型信息。
在Linux上使用gcc静态编译和链接的简单C“hello,world”程序大约为750 kB,包括printf的实现。使用fmt.Printf的等效Go程序重量为几兆字节,但其中包括更强大的运行时支持以及类型和调试信息。
使用gc编译的Go程序可以与-ldflags = -w标志链接,以禁用DWARF生成,从二进制文件中删除调试信息,但不会丢失其他功能。这可以大大减小二进制大小。
用Golang编写的“Hello World”编译生成3mb二进制文件...
这是夸大其词;它是2.0MB。
$ go version
go version devel +c7026f9d14 Sat Feb 9 17:34:48 2019 +0000 linux/amd64
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
$ go build hello.go
$ ./hello
Hello, 世界
$ ls -s -h ./hello
2.0M ./hello
$