编程 压缩go build打包的可执行文件 —— 3.4MB -> 897K

2024-11-19 05:34:41 +0800 CST views 527

如何压缩 Go build 打包的可执行文件

在使用 Go 语言开发项目并通过 go build 生成可执行文件时,默认的文件体积通常较大,特别是针对简单的程序。本文将介绍如何将 Go 编译后的可执行文件从 3.4MB 压缩到 897K,通过减少文件体积,优化运行效率。

1. 使用 upx 进行压缩

UPX(Ultimate Packer for eXecutables) 是一个支持多种格式可执行文件压缩的工具。它能够在保持原有功能的前提下,显著减少可执行文件的大小。

安装 UPX

首先,需要安装 UPX,以下是不同平台的安装方式:

  • macOS:使用 Homebrew 安装
brew install upx
  • Linux:使用包管理器安装
sudo apt-get install upx
  • Windows:从 UPX官网 下载并解压后将其加入到环境变量中。
压缩可执行文件

假设已经通过 go build 生成了一个名为 myapp 的可执行文件,使用以下命令对其进行压缩:

upx myapp

UPX 会自动处理压缩,并输出类似于以下的压缩信息:

UPX 3.96        Copyright (C) 1996-2021
File size         Ratio      Format      Name
-----------------------------------------------
3440K -> 897K    26.08%      macho/amd64 myapp

通过 UPX 压缩,文件大小可以从 3.4MB 缩小到 897K。

2. 禁用符号表与调试信息

Go 编译器默认会在生成的可执行文件中附带符号表与调试信息。这些信息对调试有帮助,但在生产环境中是不必要的。通过去掉这些信息可以进一步减小文件大小。

在执行 go build 时,可以使用 ldflags 参数:

go build -ldflags="-s -w" -o myapp
  • -s:去掉符号表
  • -w:去掉调试信息

这一步可以显著减少可执行文件的大小。例如,原本生成的 3.4MB 文件可能会减少到约 2MB。

3. 禁用 CGO

Go 编译器默认支持 CGO(调用 C 语言代码的功能),这会在某些情况下增加可执行文件的大小。通过显式禁用 CGO,可以进一步减小文件大小。可以通过设置环境变量禁用 CGO:

export CGO_ENABLED=0
go build -o myapp

这样,生成的可执行文件会是纯 Go 实现,不会依赖 C 语言库。

4. 结合使用 UPX 和优化编译

通过结合使用禁用符号表、调试信息、CGO,以及 UPX 压缩,可以大幅缩小 Go 可执行文件的体积。最终的打包和压缩流程如下:

CGO_ENABLED=0 go build -ldflags="-s -w" -o myapp
upx myapp

在这个例子中,经过上述步骤,原始 3.4MB 的可执行文件最终压缩到了 897K,且保持正常功能。

5. 压缩与运行效率的权衡

需要注意的是,使用 UPX 压缩文件后,程序在运行时会有一个解压过程,这可能会影响启动时间。如果你的应用需要快速启动(例如在容器化环境下),可能需要根据具体情况权衡压缩大小与运行效率。

总结

通过以下步骤,Go 可执行文件可以从 3.4MB 压缩到 897K:

  1. 使用 upx 压缩文件。
  2. 使用 go build 时禁用符号表和调试信息(-ldflags="-s -w")。
  3. 禁用 CGO(CGO_ENABLED=0)。

这些方法将有助于显著减少 Go 应用的文件大小,特别适用于需要传输或部署到资源受限环境的场景。

复制全文 生成海报 Go语言 编程 软件优化 开发工具

推荐文章

markdown语法
2024-11-18 18:38:43 +0800 CST
WebSocket在消息推送中的应用代码
2024-11-18 21:46:05 +0800 CST
PHP服务器直传阿里云OSS
2024-11-18 19:04:44 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
Roop是一款免费开源的AI换脸工具
2024-11-19 08:31:01 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
Vue3结合Driver.js实现新手指引功能
2024-11-19 08:46:50 +0800 CST
HTML和CSS创建的弹性菜单
2024-11-19 10:09:04 +0800 CST
淘宝npm镜像使用方法
2024-11-18 23:50:48 +0800 CST
Golang 随机公平库 satmihir/fair
2024-11-19 03:28:37 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
前端如何一次性渲染十万条数据?
2024-11-19 05:08:27 +0800 CST
使用 Go Embed
2024-11-19 02:54:20 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
程序员茄子在线接单