我在 Mac 写了个服务,硬要它在 18 岁高龄的 Windows 服务器上跑,结果…

张开发
2026/4/4 4:49:17 15 分钟阅读
我在 Mac 写了个服务,硬要它在 18 岁高龄的 Windows 服务器上跑,结果…
前言事情是这样的。我有个朋友以下称他为怨种朋友找到我说 帮我写个 Go 服务在你自己 Mac 上开发最后要能跑在咱们公司那台快入土的 Windows 2008 服务器上。我当时的内心毫无波澜甚至还想笑 多大点事Go 跨平台编译了解一下分分钟搞定然后我被现实按在地上摩擦了 72 个小时。第一幕自信如我在 Mac 上用 Go 写服务行云流水mkdir cool-service cd cool-service go mod init cool-service # 噼里啪啦一顿猛写... # 省略 1000 行代码... go run main.go # ✅ 完美运行怨种朋友问 能编译成 Windows 的 exe 吗我邪魅一笑 一行命令的事GOOSwindows GOARCHamd64 go build -o cool-service.exe main.go三天后怨种朋友发来消息 跑不起来报错说缺少什么 DLL。我 第二幕18 岁高龄的服务器我后来才知道那台 Windows 2008 服务器是 2008 年发布的——比我表弟的年龄都大。Go 1.21 编译出来的 exe 依赖比较新潮的 Windows API但这台老爷机表示 这些是啥不认识。而且最关键的是64 位的 exe 在 Windows 2008 上各种水土不服但 32 位的反而跑得欢快。第三幕Mac 上多版本 Go 共存问题来了我 Mac 上跑的是 Go 1.26总不能为了编译一个 exe 就把整个开发环境降级吧答案是当然不用Go 官方本身就支持多版本并存手动操作非常简单。步骤一下载老版本 Go去 Go 官网下载页go.dev/dl/找到你需要的版本比如go1.18.10.darwin-arm64.tar.gz注意选对架构M 芯片选 arm64Intel 选 amd64。# M 芯片 Mac curl -O https://go.dev/dl/go1.18.10.darwin-arm64.tar.gz # Intel Mac curl -O https://go.dev/dl/go1.18.10.darwin-amd64.tar.gz步骤二解压到指定目录mkdir -p ~/go-versions tar -C ~/go-versions -xzf go1.18.10.darwin-arm64.tar.gz解压后会得到~/go-versions/go/目录这就是一个独立的 Go 工具链。步骤三验证一下~/go-versions/go/bin/go version # go version go1.18.10 darwin/arm64 # 你原来的 Go 一点没受影响 go version # go version go1.26.1 darwin/arm64两个版本和平共处谁也不碍着谁。步骤四编译时指定老版本GOOSwindows GOARCH386 CGO_ENABLED0 \ ~/go-versions/go/bin/go build -ldflags-s -w -o cool-service.exe main.go完事1.26 照常用1.18 单独放着编译老系统用的 exe。小技巧你可以设个别名方便使用# 加到 ~/.zshrc alias go18~/go-versions/go/bin/go alias go26go之后go18 build就是用 1.18 编译go26 build就是用 1.26 编译。第四幕32 位才是 yyds编译命令解析GOOSwindows GOARCH386 CGO_ENABLED0 \ go build -ldflags-s -w -o cool-service.exe main.go # ┌──────────────┬──────────────────────────────────┐ # │ 参数 │ 含义 │ # ├──────────────┼──────────────────────────────────┤ # │ GOOSwindows │ 目标操作系统Windows │ # │ GOARCH386 │ 32 位架构兼容老系统的关键 │ # │ CGO_ENABLED0│ 禁用 CGO不依赖外部动态库 │ # │ -ldflags │ 去掉符号表和调试信息 │ # │ -s -w │ exe 体积更小大约能减 30% │ # └──────────────┴──────────────────────────────────┘怨种朋友测试后跑起来了我感动得差点落泪。翻车与自救总结我以为实际上一行命令搞定跨平台Windows 2008你谁啊Go 版本越高越好老服务器需要老版本 Go 32 位编译64 位才是主流18 岁的服务器只认 32 位网上说的都靠谱还是自己踩坑最深刻

更多文章