Go 安装之环境变量 GOPATH

一、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 # 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导包规则:

  1. 先去 GOROOT/src/路径下找 /usr/local/go/src/MyApp1 (系统环境变量 $GOROOT,即使用go env命令显示的GOROOT)

  2. 如果1没有,就去 Project GOPATH/src/路径下找 /Users/lxxxxxk/Desktop/my-go/src/MyApp1

  3. 如果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


Go 安装之环境变量 GOPATH
https://flepeng.github.io/021-Go-11-安装和配置-Go-安装之环境变量-GOPATH/
作者
Lepeng
发布于
2024年11月11日
许可协议