在Go中,可以使用静态编译来将Go程序编译为一个独立的可执行文件,其中包含了所有的依赖库和运行时环境,不需要依赖外部的共享库。这样就可以在没有Go语言环境的机器上直接运行编译后的可执行文件。
# output-file 是输出的可执行文件名
go build -o output-file main.go
优点是可以将这个可执行文件复制到其他机器上,无需安装Go语言环境,就可以直接运行它。
缺点是生成的可执行二进制文件的体积较大。
Go语言本身不支持动态编译(即在运行时动态加载和执行代码)。
但是 Go 1.8及以上版本引入了插件机制,允许在运行时动态加载和执行插件代码。
可以将插件代码编译为插件模块,然后在主程序中通过插件机制加载和执行该模块。使用plugin包可以实现这个功能。
另外,可以使用Go语言的外部库来实现动态加载和执行其他语言的代码。
例如,使用cgo库可以与C语言进行交互,通过加载和执行C代码来实现动态编译的效果。也可以使用与其他语言的交互库,如go-python、go-lua等,来加载和执行相应语言的代码。
# -s 去掉符号信息
# -w 去掉调试信息
go build -ldflags="-s -w" -o output-file main.go
实测可以原本的 33M 可以减少到 27M。
UPX https://github.com/upx/upx 是一个可执行文件的压缩工具。
UPX压缩包含两个部分:
程序执行时,也包含两个部分:
也就是说,upx 在程序执行时,会有额外的解压动作,不过这个耗时几乎可以忽略。
如果对编译后的体积没什么要求的情况下,可以不使用 upx 来压缩。一般在服务器端独立运行的后台服务,无需压缩体积。
# 安装UPX
wget https://github.com/upx/upx/releases/download/v4.0.2/upx-4.0.2-amd64_linux.tar.xz
tar -Jxf upx*.tar.xz
sudo cp upx*/upx /usr/bin
upx -v
# 压缩
upx [options] yourfile
-1[23456789]:不同的压缩级别,数值越高压缩率越高,但耗时更长。
对于小于 512 KiB 的文件默认使用 -8,其他的默认为 -7。
--best:最高压缩级别
--brute:尝试使用各种压缩方式来获取最高压缩比
--ultra-brute:尝试使用更多的参数来获取更高的压缩比
-o [file]:将压缩文件保存为 [file]
优点
缺点
# 具体使用
go build -ldflags="-s -w" -o output-file main.go && upx output-file
实测可以将 33M 减少到 7.1M 。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。