离线局域网装 go 成功的关键是三件事:goroot 指向完整解压目录(含 bin/src/pkg)、依赖通过 go mod vendor 预置并启用 vendoring 模式、goproxy=off 与 gosumdb=off 设为系统级环境变量;缺一即卡在模块加载或校验。

离线局域网里装 Go 不是“能不能装上”的问题,而是“GOROOT 指对没、模块找得到、校验跳得过”这三件事做没做到——漏一个,GoLand 就卡在 Loading modules,go build 就停在 verifying github.com/xxx@v1.2.3。
GOROOT 必须指向完整解压目录,不能只选 bin 或 go.exe
GoLand 不自带 Go 编译器,它只调用你指定的 GOROOT 下的 bin/go。离线机上若只拷贝了 go.exe 或把 GOROOT 设成 C:\go\bin,IDE 启动后会报 Cannot find Go SDK,终端里运行 go version 直接提示 command not found。
- 在联网机下载官方二进制包(如
go1.22.5.linux-amd64.tar.gz),解压后整个go文件夹(含bin/、src/、pkg/)拷贝到离线机固定路径,例如/usr/local/go或C:\go - GoLand 中设置:
Settings → Go → GOROOT → + → 选中 /usr/local/go(不是子目录) - 验证:在 GoLand 终端执行
go env GOROOT,输出必须和你设置的路径完全一致;再跑go version看是否返回带架构的版本号
依赖必须提前 go mod vendor,且项目根目录要有 vendor/modules.txt
GoLand 默认启用 Modules,打开项目时自动触发 go mod download。离线状态下它不会报错,只会无限等待 proxy.golang.org——这是最隐蔽的卡顿点。靠 GOPROXY=direct 不够,因为 vendor 模式本身要被显式激活。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 在联网机、用**完全相同版本**的 Go(如
go1.22.5)进入项目根目录,依次执行:go mod tidy→go mod vendor - 确认生成了
vendor/目录,且里面包含vendor/modules.txt(这是 vendor 是否生效的关键元数据) - 把整个项目(含
go.mod、go.sum、vendor/)整体拷贝到离线机,不要只复制源码 - GoLand 中需手动开启 vendor 支持:
Settings → Go → Go Modules → Vendoring mode → Enabled;否则 IDE 仍走pkg/mod
GOPROXY=off 和 GOSUMDB=off 必须设为环境变量,不能只写命令行前缀
只在构建时写 GOPROXY=direct go build 是无效的。GoLand 内置终端、git hook、CI 脚本等子进程不会继承临时变量,它们仍会尝试解析域名或连接 sumdb,导致静默失败或超时。
- Linux:写入
/etc/profile.d/golang.sh,内容为:export GOPROXY=offexport GOSUMDB=offexport GO111MODULE=on - Windows:在系统属性 → 环境变量 → 系统变量中新增
GOPROXY值为off,同理设GOSUMDB=off - 验证:新开终端,运行
go env GOPROXY GOSUMDB,输出应为off off;再执行sh -c 'go env GOPROXY'确认子进程也生效
交叉编译或含 cgo 的项目,离线时还得处理底层依赖
即使 vendor 和环境变量全对,go build 仍可能报 exec: "gcc": executable file not found in $PATH 或 cannot find -lc——这不是 Go 的问题,是 cgo 绑定系统库时缺工具链或头文件。
- 若项目含
import "C"或依赖net、os/user等包,离线机必须预装对应 C 工具链:gcc、glibc-devel(CentOS/RHEL)或libc6-dev(Debian/Ubuntu) - 交叉编译(如 Linux 上编译 Windows 二进制)时,禁用 cgo 更稳妥:
CGO_ENABLED=0 go build -o myapp.exe ./cmd/main - 查哪些包用了 cgo:
go list -f '{{.CgoFiles}}' ./...;关键第三方库(如github.com/mattn/go-sqlite3)建议提前静态编译好并用go mod edit -replace指向本地 .a 文件
真正离线不是“没报错”,而是从 go mod vendor 到 go build 全程不发任何 DNS 请求、不建一个 TCP 连接——这点必须用 tcpdump -i any port 53 or port 443 实测确认,别信感觉。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










