了解 Go 二进制大小

在深入研究解决方案之前,首先必须了解为什么 Go 二进制文件很大。

主要原因之一是 Go 二进制文件默认是静态链接的。这意味着所有必需的库和依赖项都捆绑到一个可执行文件中,这确保了二进制文件是独立的并且可以在没有外部依赖项的情况下运行。虽然这有优点,但它也会导致更大的二进制大小。

影响二进制大小的另一个重要因素是默认包含的调试信息和符号。此信息在开发阶段很有帮助,尤其是对于调试而言,但在生产中可能并不总是必需的。

剥离不必要的数据

使用 -ldflags "-w -s" 即可。

go build 命令允许使用链接器标志来修改最终二进制文件的创建方式。对于减少二进制大小,两个特别有用的标志是:

  • -w:此标志省略 DWARF 符号表,有效删除调试信息。
  • -s:这会从二进制文件中删除符号表和调试信息。 通过组合这些标志,我们可以创建一个比其默认对应版本小得多的二进制文件。

编译参数

go build -ldflags "-w -s"

文件大小

ll go-docker out/go-docker 
-rwxr-xr-x 1 root root 2011288  3月  3 18:31 go-docker*
-rwxr-xr-x 1 root root 3037679  3月  3 18:28 out/go-docker*

详细文件信息

file go-docker out/go-docker 
go-docker:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=9q-HSYbByUGGk88cWy-r/h5RNi1zssJwWEYkgyMrM/fvmeO-QzG9vDGngzxoI5/kjTmKQOVf-WX-MAepbfj, stripped
out/go-docker: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=-HAObMy8qMes07UOkTiX/8DjxhzF9T6g7LtqwAPCm/fvmeO-QzG9vDGngzxoI5/kONPkruixn_P2z_CdHH2, with debug_info, not stripped