@
saltbo 首先,使用 Go modules 之后,GOPATH 是依旧存在的。
根据最新的 go 基础文档
https://golang.org/doc/code.html,你安装的第三方包都会被下载到 GOPATH 下的 pkg/mod 目录中:
Module dependencies are automatically downloaded to the pkg/mod subdirectory of the directory indicated by the GOPATH environment variable. The downloaded contents for a given version of a module are shared among all other modules that require that version, so the go command marks those files and directories as read-only.
goimports 会根据 $GOPATH/pkg/mod 下已经安装过的包来实现自动导入(前提是你的项目包含 go.mod ,是一个 Go Modules 项目,否则 goimports 也不会帮你),而 goimports 属于 go 官方工具,所以可以认为是官方的行为。
再说 Goland,在 Go modules 之前,go 要求将项目都放在 $GOPATH/src 下,这也就是“GOPATH 开发模式”的由来。在 Go modules 出来之后,Goland 区分两种模式,Go 和 Go Modules 。
Go 模式,你的项目必须放在 $GOPATH/src 下( Goland 提供了项目 GOPATH 功能,可以临时设置项目路径为 GOPATH ),然后你 go get 的包也会存在 $GOPATH/src 下,这样 Goland 就可以自动导入 $GOPATH/src 下的包了。
而 Go Modules 模式下,Goland 就完全只认 go.mod 中有的包,go.mod 中没有的包完全不认,不会自动去 $GOPATH/pkg/mod 中导入。
但是 Goland 在代码中右键 -> Go Tools -> Goimports File 却可以自动去 $GOPATH/pkg/mod 导入的,因为这个功能调用的是官方的 goimports 工具。但是虽然自动导入了,Goland 依旧显示为红色,不认,你还得再右键 Show Context Actions -> Sync dependencies 同步一遍。
由此,我认为这是 Goland 没遵循 Go Modules 所产生的 bug 。
而 VSCode 因为自身不提供功能,所有功能都依赖 Go 的官方工具,所以可以按照规则自动完成。
GOPATH 开发模式,代码必须放在 $GOPATH/src 下,所有装的包也都在 $GOPATH/src 下。
Go Modules 开发模式,项目中包含 go.mod 文件,所有装的包都在 $GOPATH/pkg/mod 下,按版本共享。
所以你附言 3 说的“搞了半天你们都还在用 GOPATH”是不对的,根据规则,只要 go 版本足够,项目中只要有 go.mod 就是 Go Modules 模式了。Goland 不支持提示只是因为 Goland 没有用官方工具链而产生的 bug,使用 Goland 右键菜单中的官方 goimports 工具可以正确识别 Go Modules 的依赖包。