输出该问题时说明在 Go 语言的启动编译(Build)阶段,出现了编译问题,往往是编译配置的问题。可以通过以下思路去排查对应的错误。
(1)首先可以查看被排除的 Go 文件是否启用了条件编译,通常的形式为在文件的首行添加(以 Linux 为例):
// +build linux
// 或
//go:build linux
// +build
会逐渐取代 //go:build
,但 go 1.16 之前的版本只支持 //go:build
。加上上述条件编译后,该 Go 文件将只在 Linux 操作系统环境下才会被编译,若是 MacOS 和 Windows 环境下将无法被编译。解决方案是在 go env 和代码编辑器中都配置好 GOOS 参数(VSCode 在左下角的 GO/env 中设置;GoLand 在左上角的 settings 中配置)。
go env -w GOOS=linux
(2)若非操作系统环境的问题,接着考虑是否有交叉编译,即在 Go 语言编译时调用了其他语言的情况,一般是 C 语言。此时需要在 go env 中开启 CGO_ENABLED 特性。这样在进行 go build 时,就会在编译和链接阶段启动 gcc 编译器。(经评论指出,开启 CGO_ENABLED 需要下载对应操作系统的 gcc 库)
go env -w CGO_ENABLED=1
在 go 的旧版本中基于 GOPATH 来寻找依赖,但可能依赖包的依赖未导入,可以考虑打开 GO111MODULE,实现模块支持。go 命令行会使用modules,而完全不去 GOPATH 目录下查找模块。
go env -w GO111MODULE=on
这是我最终排查出的错误,因为在 GoLand 的 settings 中可以存在三个 GOPATH,分别是 Global、Project 和 Module 的 GOPATH。
Global 在 go env 中配置,Project 是项目的 GOPATH。若配置了多个 GOPATH,在导入二方或三方包时,可能在多个 GOPATH 下都有对应的缓存模块,即重复依赖。此时需要删除多余的 GOPATH。