一、GOPATH GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录(也称为工作区)。
工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。
工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,
输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。
GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录,参见下表
平台
GOPATH 默认值
举例
Windows
%USERPROGILE%/go
C:\Users\用户名go
Unix
$HOME/go
/home/用户名/go
可以通过go env命令查看Go的环境变量,我使用的mac效果如下()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 GO111MODULE ='' GOARCH ='arm64' GOBIN ='' GOCACHE ='/Users/fenglepeng1/Library/Caches/go-build' GOENV ='/Users/fenglepeng1/Library/Application Support/go/env' GOEXE ='' GOEXPERIMENT ='' GOFLAGS ='' GOHOSTARCH ='arm64' GOHOSTOS ='darwin' GOINSECURE ='' GOMODCACHE ='/Users/fenglepeng1/go/pkg/mod' GONOPROXY ='' GONOSUMDB ='' GOOS ='darwin' GOPATH ='/Users/fenglepeng1/go' GOPRIVATE ='' GOPROXY ='https://proxy.golang.org,direct' GOROOT ='/usr/local/go' GOSUMDB ='sum.golang.org' GOTMPDIR ='' GOTOOLCHAIN ='auto' GOTOOLDIR ='/usr/local/go/pkg/tool/darwin_arm64' GOVCS ='' GOVERSION ='go1.23.3' GODEBUG ='' GOTELEMETRY ='local' GOTELEMETRYDIR ='/Users/fenglepeng1/Library/Application Support/go/telemetry' GCCGO ='gccgo' GOARM64 ='v8.0' AR ='ar' CC ='clang' CXX ='clang++' CGO_ENABLED ='1' GOMOD ='/dev/null' GOWORK ='' CGO_CFLAGS ='-O2 -g' CGO_CPPFLAGS ='' CGO_CXXFLAGS ='-O2 -g' CGO_FFLAGS ='-O2 -g' CGO_LDFLAGS ='-O2 -g' PKG_CONFIG ='pkg-config'
二、GOPATH的使用 GOPATH
目录一般为:
1 2 3 4 5 6 7 8 9 $HOME/go --bin --pkg --XX_amd64 : 其中 XX 是目标操作系统,比如 mac 系统对应的是darwin_amd64, linux 系统对应的是 linux_amd64,存放的是.a 结尾的文件。 --mod : 当开启go Modules 模式下,go get命令缓存下依赖包存放的位置 --sumdb : go get命令缓存下载的checksum数据存放的位 --src
如下是一个完整的 Go 项目的开发目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 my-go // my-go为GOPATH目录 -- bin -- myApp1 // 编译生成 -- myApp2 // 编译生成 -- myApp3 // 编译生成 -- pkg 依赖包编译后的*.a文件// -- src -- MyApp1 // 项目1 -- models -- controllers -- others -- main.go -- MyApp2 // 项目2 -- models -- controllers -- others -- main.go
设置 GOPATH 后,工程中使用 import 的根目录是 GOPATH 中的 src 目录
GOPATH 为 /Users/lxxxxxk/GolandProjects
,工程为 /Users/lxxxxxk/Desktop/my-go/src/MyApp1
那么MyApp1中使用import导入本地包的时候,这样写:
1 import "MyApp1/models" // models为包名
也就是说,GOPATH下必须要有 src 目录 ,不然 import 导包的时候会找不到
import导包规则:
先去 GOROOT/src/路径下找 /usr/local/go/src/MyApp1
(系统环境变量 $GOROOT,即使用go env命令显示的GOROOT)
如果1没有,就去 Project GOPATH/src/路径下找 /Users/lxxxxxk/Desktop/my-go/src/MyApp1
如果2还没找到,就去 Global GOPATH 路径下找 /Users/lxxxxxk/GolandProjects
(系统环境变量 $GOPATH,即使用go env命令显示的GOPATH)
三、GoLand设置GOPATH
图中的 Global GOPATH 代表全局 GOPATH,一般来源于系统环境变量中的 GOPATH;
Project GOPATH 代表项目所使用的 GOPATH,该设置会被保存在工作目录的 .idea 目录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录。
建议在开发时填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH,不使用多个 GOPATH 和全局的 GOPATH 。
否则可能会出现如下麻烦:
1 2 3 4 5 将某项目代码保存在 /home/davy/projectA 目录下,将该目录设置为 GOPATH。 随着开发进行,需要再次获取一份工程项目的源码,此时源码保存在 /home/davy/projectB 目录下, 如果此时需要编译 projectB 目录的项目,但开发者忘记设置 GOPATH 而直接使用命令行编译, 则当前的 GOPATH 指向的是 /home/davy/projectA 目录,而不是开发者编译时期望的 projectB 目录。 编译完成后,开发者就会将错误的工程版本发布到外网。
Reference