# adward @ adwarddeMacBook-Pro in ~ [10:41]
$ go env GOPATH
/Users/adward/developer/machines/golang/gopath1.25.4
(base)
# adward @ adwarddeMacBook-Pro in ~ [10:41]
$ go env GOMODCACHE
/Users/adward/developer/machines/golang/gopath1.25.4/pkg/mod
(base)
# adward @ adwarddeMacBook-Pro in ~ [10:41]
$ go env GO_HOME (base)
# adward @ adwarddeMacBook-Pro in ~ [10:41]
$ go env GOROOT
/Users/adward/developer/machines/golang/go1.25.4
(base)
# adward @ adwarddeMacBook-Pro in ~ [10:41]
$
Go 环境变量入门笔记:GOROOT、GOPATH、GOPROXY 到底是干什么的?
之前学习 Go 的时候配置过一些环境变量,比如:
export GO_HOME="/Users/adward/developer/machines/golang/go1.25.4"
export GOPATH="/Users/adward/developer/machines/golang/gopath1.25.4"
export GOPROXY="https://goproxy.cn"
时间久了容易忘,这里简单整理一下。
1. GOROOT / GO_HOME:Go 本体在哪里
严格来说,Go 官方常用的是:
GOROOT
它表示:
Go 语言本体的安装目录
里面一般有:
bin/go
pkg/
src/
也就是说,GOROOT 里面放的是 Go 编译器、标准库、Go 自带工具等内容。
有些人习惯自己写一个:
export GO_HOME="/Users/adward/developer/machines/golang/go1.25.4"
这个 GO_HOME 不是 Go 官方核心变量,只是自己定义的一个别名。
通常会配合:
export PATH="$GO_HOME/bin:$PATH"
让终端能找到 go 命令。
简单理解:
GOROOT / GO_HOME = Go 本体安装在哪里
2. GOPATH:Go 的用户工作区
GOPATH 不是 Go 的安装目录。
它更像是 Go 给用户侧内容准备的工作区。
常见结构:
$GOPATH/bin
$GOPATH/pkg
$GOPATH/pkg/mod
现在最常见的用途有两个。
第一:保存 go install 安装出来的命令行工具
比如执行:
go install github.com/air-verse/air@latest
安装出来的 air 命令通常会放到:
$GOPATH/bin
所以通常需要配置:
export PATH="$GOPATH/bin:$PATH"
这样才能直接在终端执行:
air
第二:保存 Go 下载的第三方依赖缓存
现在 Go 项目主要使用 Go Modules,也就是项目里会有:
go.mod
go.sum
当项目需要第三方依赖时,Go 会把依赖源码下载到 module 缓存里,通常是:
$GOPATH/pkg/mod
例如:
$GOPATH/pkg/mod/github.com/gin-gonic/gin@v1.10.0
所以,项目越多,下载过的依赖越多,$GOPATH/pkg/mod 可能会越来越大。
这是正常的,因为 Go 是让多个项目共享同一个依赖缓存,避免每个项目都重复下载一份。
3. 现在还需要把项目放到 GOPATH/src 下面吗?
一般不需要。
早期 Go 项目通常要放在:
$GOPATH/src/xxx
但现在 Go Modules 已经是主流。
现在写项目通常是:
mkdir my-go-project
cd my-go-project
go mod init my-go-project
只要项目里有 go.mod,项目就可以放在任意目录,比如:
~/projects/my-go-app
~/Desktop/test-go
~/developer/workspace/demo
所以:
GOPATH 不是每个项目都设置一次
一般一台电脑设置一个 GOPATH 就够了。
4. go.mod 和 go.sum 是什么?
go.mod 可以理解成项目的依赖清单。
例如:
module my-appgo 1.25require github.com/gin-gonic/gin v1.10.0
它表示:
当前项目叫 my-app
使用 Go 1.25
依赖 github.com/gin-gonic/gin v1.10.0
go.sum 则主要记录依赖的校验信息,用来确认下载下来的依赖没有被篡改。
可以简单理解为:
go.mod = 依赖清单
go.sum = 依赖校验表
类比其他语言:
Go -> go.mod / go.sum
Node.js -> package.json / package-lock.json
Python -> requirements.txt / pyproject.toml / poetry.lock
Java -> pom.xml / build.gradle
5. go get 和 go mod tidy 做了什么?
当执行:
go get github.com/gin-gonic/gin
或者:
go mod tidy
Go 大概会做这些事:
1. 分析当前项目需要哪些依赖
2. 修改 go.mod
3. 修改 go.sum
4. 下载依赖源码到 $GOPATH/pkg/mod
5. 后续编译时从缓存中读取这些源码
注意:
依赖源码通常不会复制到当前项目目录里
当前项目主要只是记录依赖信息。
真实源码通常在:
$GOPATH/pkg/mod
6. go install 和 go get 的区别
这个很容易混。
go get / go mod tidy
主要用于当前项目的依赖管理。
比如项目代码里用了:
import "github.com/gin-gonic/gin"
这时候通常使用:
go get github.com/gin-gonic/gin
或者:
go mod tidy
它们会更新当前项目的 go.mod 和 go.sum。
go install
主要用于安装命令行工具。
比如:
go install github.com/air-verse/air@latest
它会把可执行文件安装到:
$GOPATH/bin
如果设置了 GOBIN,则会安装到 GOBIN 指定的位置。
简单记:
项目要 import 的库:go get / go mod tidy
终端要直接运行的工具:go install
7. GOPROXY:Go 下载依赖的代理
GOPROXY 表示 Go 下载第三方依赖时走哪个代理。
比如:
export GOPROXY=" https://goproxy.cn ,direct"
含义是:
优先从 goproxy.cn 下载依赖
如果代理下载不到,就 direct 直接访问原始地址
在国内环境下,配置 GOPROXY 可以明显减少依赖下载失败的问题。
8. 推荐的基础配置
如果是自己手动管理 Go 安装目录,可以这样配置:
export GO_HOME="/Users/adward/developer/machines/golang/go1.25.4"
export GOROOT="$GO_HOME"export GOPATH="/Users/adward/developer/machines/golang/gopath1.25.4"
export GOPROXY=" https://goproxy.cn ,direct"export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"
含义分别是:
GO_HOME / GOROOT:Go 本体安装目录
GOPATH:Go 用户工作区
GOPROXY:Go 下载依赖使用的代理
PATH:让系统能找到 go 命令和 go install 安装的工具
9. 如果 GOPATH 太大怎么办?
因为依赖缓存都在:
$GOPATH/pkg/mod
所以用久了可能会变大。
可以查看当前配置:
go env GOPATH
go env GOMODCACHE
清理 module 缓存:
go clean -modcache
清理后,如果项目再次需要这些依赖,Go 会重新下载。
最后总结
可以用这一句话记住:
GOROOT / GO_HOME:Go 本体在哪里
GOPATH:Go 的用户工作区,放工具和依赖缓存
GOPROXY:Go 下载依赖走哪个代理
go.mod:当前项目需要哪些依赖
go.sum:依赖校验信息
再压缩一点:
go.mod 负责记录“这个项目要什么”
$GOPATH/pkg/mod 负责保存“真实下载下来的依赖”
$GOPATH/bin 负责保存“go install 安装出来的工具”
现在写 Go 项目,重点看项目里有没有 go.mod,而不是看它是不是放在 $GOPATH/src 下面。
