不能,但可以提前缓存。go mod download默认需联网拉取依赖,断网时若本地无完整缓存会失败;必须先在有网环境执行go mod download并确保$GOMODCACHE完整,再配合GOPROXY=off和GOSUMDB=off方可离线使用。

go mod download 能否在无网络时完成依赖解析
不能,但可以提前缓存。模块依赖解析本身不依赖网络,但go mod download默认会向GOPROXY发起 HTTP 请求拉取 zip 包;若代理不可达且本地无缓存,会直接失败并报错no required module provides package或failed to download。
验证方式:断网后运行go mod download -x(-x 显示每一步命令),观察是否卡在GET https://.../@v/...。若卡住,说明没命中本地缓存。
- 提前缓存所有依赖:
go mod download必须在联网且 GOPROXY 可用时执行一次,它会把所有依赖存到$GOCACHE/download下 - 强制离线模式:
go env -w GONOSUMDB="*" && go env -w GOPROXY=off,再跑go build——此时只走本地缓存,失败即说明缓存不全 - 检查缓存完整性:
go list -m all | xargs -n1 go mod download -json可逐个验证每个模块是否已缓存(输出含"Dir"字段即存在)
GOOS=js 或 GOARCH=wasm 下 go test 是否可靠
不可靠,尤其对 I/O、网络、os/exec 等包。WASM 目标不支持系统调用,os.Open、net.Listen、exec.Command 会直接 panic 或静默失败,go test 却可能仍返回 PASS。
典型现象:测试文件里写了os.Create("test.txt"),在GOOS=js GOARCH=wasm下编译能过,运行时却报panic: not implemented,而go test默认不捕获 runtime panic。
立即学习“go语言免费学习笔记(深入)”;
- 必须加
-exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec"参数才能真正执行 wasm 测试,否则只是编译检查 - 避免在 wasm 测试中使用
os、net、syscall等包;改用io、bytes、encoding/json等纯逻辑包 - CI 中验证 wasm 兼容性,建议用
GOOS=js GOARCH=wasm go build -o /dev/null ./...+go tool compile -S看是否有未实现符号引用
go test -race 在交叉编译环境是否生效
不生效,且不会报错。Data Race 检测器(-race)是针对特定目标平台编译的运行时库,仅在GOOS=linux GOARCH=amd64(或 darwin/arm64 等主流组合)下可用;对GOOS=windows、GOOS=freebsd甚至GOOS=linux GOARCH=arm64,go test -race会被静默忽略。
验证方法:在非 linux/amd64 环境下运行go test -race -x,观察输出中是否出现-race相关链接参数(如-linkmode=external -ldflags="-race");若没有,说明已被 drop。
- 真要测 race,必须在目标平台原生环境中跑
go test -race,比如 ARM 服务器上直接编译运行 - 交叉编译时若误加
-race,构建产物体积会异常大(因嵌入了 race runtime),但实际无检测能力 - CI 中建议按平台分组:linux/amd64 跑
-race,其余平台用go vet和golangci-lint补位
极端路径名(含 Unicode、空格、超长名)是否影响 go mod vendor
会影响,尤其是 Windows 和旧版 macOS。vendor 过程会复制文件到vendor/目录,若模块路径含非法字符(如U+200B ZERO WIDTH SPACE)或长度超 260 字符(Windows MAX_PATH),go mod vendor可能中途退出,错误信息却只显示open vendor/xxx: filename too long或invalid argument,不指明原始模块名。
验证技巧:用go list -mod=readonly -f '{{.Dir}}' all | wc -L查最长路径;用find . -name 'go.mod' -exec dirname {} \; | iconv -f utf-8 -t ascii//translit粗筛含非常规 Unicode 的路径。
- 临时规避:设
GO111MODULE=on且不启用 vendor,直接go build——模块路径只参与解析,不触发文件系统写入 - 根治方式:在
go.mod中用 replace 指向本地干净路径,或让上游模块发布时避免非常规字符 - CI 中加检查:
go list -m all | grep -E '[[:space:]]|[^[:ascii:]]|.{256,}',有输出即告警
$GOCACHE,是只读、内容寻址的;vendor 是可写、路径寻址的——同一份代码,在缓存里能跑通,放到 vendor 后因路径变更或文件系统限制就崩了。


















