Go 编译时去掉 -w 和 -s 参数会保留调试信息生成带有符号表和 DWARF 调试信息的可执行文件。这两个参数的含义参数 作用 去掉后的影响-w 去掉 DWARF 调试信息 保留后可用 dlv/gdb 调试-s 去掉符号表symbol table 保留后可用 pprof 分析、栈追踪显示函数名如何打包去掉这两个参数基础编译go build -o myapp main.go生产环境只优化保留调试信息# 仅开启编译优化和内联保留所有调试信息go build -ldflags-O2 -o myapp main.go常用 ldflags 组合无 -w -s# 仅设置版本信息保留调试符号go build -ldflags-X main.version1.0.0 -X main.buildTime$(date %Y%m%d) -o myapp main.go对比带与不带参数的文件大小方式 命令 典型体积默认保留调试信息 go build ~15MB去掉调试信息 go build -ldflags-w -s ~10MB进一步 UPX 压缩 upx -9 ~3-5MB什么场景下应该去掉 -w -s✅ 建议保留即不要加 -w -s的场景- 需要线上问题排查dlv attach 调试- 需要 CPU/Memory profilinggo tool pprof- 需要查看 panic 堆栈的完整函数名- 容器/K8s 环境对体积不敏感✅ 可以加 -w -s 的场景- 嵌入式/边缘设备对体积极度敏感- 分发 CLI 工具给终端用户- 明确不需要任何线上调试能力快速验证是否保留符号表# 查看符号表是否存在go tool nm myapp | head# 查看 DWARF 信息是否存在readelf --debug-dumpinfo myapp 2/dev/null | head如果你是在某个具体项目比如之前提到的 leijmdas 相关项目中调整构建脚本可以把 Makefile 或构建脚本贴出来我帮你针对性修改。