JS 转 Go:环境配置与依赖管理
本页关键词:Homebrew / 官方安装包、
$SHELL、.zshrc/.bash_profile、PATH、GOPATH、GOBIN、GOPROXY、GOMODCACHE、go.sum、GOPRIVATE 面向刚准备写第一行 Go 的 JS 开发者:先把 Go 装好、命令能敲、依赖能拉下来,语法从 01-入门与语法 开始。
一、先装 Go
装 Go 和装 Node 是一回事:要么用包管理器,要么用官网安装包。
- macOS,最省事:Homebrew
brew install go。Homebrew 会把go链接进它自己的 bin 目录(Apple 芯片是/opt/homebrew/bin,Intel 是/usr/local/bin),这个目录默认已经在 PATH 里,装完直接能用。 - 官方安装包:去 go.dev/dl 下载。
- macOS 的
.pkg:装到/usr/local/go,安装器会顺手把/usr/local/go/bin写进系统 PATH,不用自己配。 - Linux 的
.tar.gz:解压到/usr/local后,要自己把/usr/local/go/bin加进 PATH(下一节讲),否则连go都找不到。 - Windows 的
.msi:自动配好 PATH。
- macOS 的
- 多版本:Go 没有 nvm 那种官方多版本管理器。需要临时切版本时用
go install golang.org/dl/go1.22@latest装一个go1.22命令,或用第三方工具。
装完先验证:
go version # 打印版本号,说明 go 命令能被找到
go env # 打印一堆 Go 环境变量,后面几节都要用如果 go version 报 command not found: go,先别怀疑没装成功——大概率是 PATH 没配对。下一节专门解决。
二、echo $SHELL:先搞清楚你在用哪个 shell
配 PATH 之前必须先知道自己用的是哪个 shell,因为不同 shell 开机读的配置文件不一样,配错文件等于没配,这是新手「明明加了却不生效」的头号原因。
echo $SHELL- 输出
/bin/zsh→ 你是 zsh。macOS 从 Catalina(2019)起默认就是 zsh。 - 输出
/bin/bash→ 你是 bash。多见于旧版 macOS 和大部分 Linux。
改哪个文件,看这张表:
| shell | 该改的配置文件 | 备注 |
|---|---|---|
| zsh | ~/.zshrc | macOS 默认 |
| bash(macOS) | ~/.bash_profile | macOS 登录 shell 读它 |
| bash(Linux) | ~/.bashrc | 多数 Linux 发行版 |
几个容易踩的点:
$SHELL是你的默认登录 shell,不一定等于当前窗口正在跑的那个。临时切了别的 shell 时,用echo $0看当前这个。- 用什么编辑器改这个文件都行——
vim ~/.zshrc、nano ~/.zshrc、code ~/.zshrc、open -e ~/.zshrc都可以。文件内容才是关键,编辑器只是工具,不用纠结一定要用 vim。 - 别照着 bash 的教程去改 zsh,也别在
~/.bashrc里配了半天,回头发现自己其实是 zsh。
三、PATH 是什么,为什么要配
PATH 是什么:你在终端敲 go、node、git,shell 并不知道这些程序躺在硬盘哪个角落。它会按顺序去 PATH 这个环境变量里列的一串目录里找同名的可执行文件,找到第一个就执行,一个都找不到就报 command not found。
echo $PATH
# /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:... 冒号分隔的一串目录JS 类比:node / npm 能直接敲,就是因为它们所在目录在 PATH 里;nvm 切 Node 版本,本质就是改 PATH,把当前版本的 bin 指过去。Go 这里的道理一模一样。
为什么 Go 要专门配:Go 有两处可能需要进 PATH。
- Go 工具链自己(
go命令)- Homebrew 或官方
.pkg装的:bin 目录一般已在 PATH,通常不用管。 - Linux 用
.tar.gz装到/usr/local/go的:必须手动把/usr/local/go/bin加进 PATH,否则go都敲不出来。
- Homebrew 或官方
go install装出来的工具(golangci-lint、dlv、air等)go install xxx@latest会把编译好的可执行文件放到$(go env GOBIN);没设 GOBIN 时放到$(go env GOPATH)/bin,默认就是~/go/bin。- 如果
~/go/bin不在 PATH,就会出现「装是装上了,但敲命令名说找不到」。这是学 Go 时第二常见的 PATH 坑。
怎么配(以 zsh 为例,bash 就把文件换成 ~/.bash_profile):
# 追加到 ~/.zshrc
export PATH="/usr/local/go/bin:$PATH" # 只有 Linux tar.gz 手动安装才需要这行
export PATH="$(go env GOPATH)/bin:$PATH" # 让 go install 装的工具能直接敲命令名改完让它生效:
source ~/.zshrc # 重新加载配置;或者干脆关掉重开一个终端为什么写成 "...:$PATH" 而不是直接赋值:$PATH 里已经有 /usr/bin、/bin 这些系统关键目录。要把新目录拼接到原值上,所以带上 :$PATH。如果直接 export PATH="/usr/local/go/bin",就会把原来那一串全冲掉,接着 ls、git 都可能找不到。放在最前面表示优先用你新加的这份。
验证:
which go # 打印 go 的实际路径,能打印出来说明 PATH 里找得到
go env GOPATH GOBIN # 确认 go install 的工具会装到哪踩坑要点:
command not found: go,或「go install完命令用不了」,几乎都是 PATH 问题,不是安装失败。排查顺序固定:先echo $SHELL确认改对了文件,再确认go和~/go/bin两处都进了 PATH。
四、几个关键 Go 环境变量(go env)
go env 会列出 Go 的所有配置。这几个新手要认识,改的时候优先用 go env -w KEY=VALUE(写进 Go 自己的配置文件,不用动 shell,跨终端一致):
| 变量 | 作用 | 默认值 | 大致的 Node 类比 |
|---|---|---|---|
GOPATH | 工作区与缓存的根目录 | ~/go | 约等于全局包目录 |
GOBIN | go install 产物目录 | 空 → $GOPATH/bin | npm i -g 的 bin |
GOMODCACHE | 依赖下载后缓存的位置 | $GOPATH/pkg/mod | 全局共享版的 node_modules |
GOPROXY | 拉依赖走的代理 | https://proxy.golang.org,direct | npm registry |
GOSUMDB | 校验依赖哈希的校验和数据库 | sum.golang.org | 类似 lock 的完整性校验 |
GOPRIVATE | 哪些路径算私有、跳过代理和校验 | 空 | 私有 registry / scope |
国内网络下最常改的是 GOPROXY:
go env -w GOPROXY=https://goproxy.cn,directgoproxy.cn(七牛维护)是常用国内镜像,direct 表示代理里没有就直连源站。配好这一步能解决绝大多数「go get 卡住 / 拉不下来」。
- 用
go env -w改,不要写死在 shell 里。Go 会把它存到$(go env GOENV)指向的配置文件。 - 想看某个值:
go env GOPROXY。想改回默认:go env -u GOPROXY。
五、依赖管理:从 npm 过来怎么用
Go 的依赖以模块(module)为单位,一个模块一个 go.mod。go.mod ↔ package.json、go.sum ↔ package-lock.json 这类概念对照见 02-类型接口与包 第六节;go.mod 每个字段什么意思见 01-入门与语法 第四节。这里只讲实际怎么操作、依赖到底去了哪。
初始化和加依赖:
go mod init github.com/you/app # 生成 go.mod,等于 npm init
go get github.com/gin-gonic/gin@v1.9.1 # 加 / 升级一个依赖到指定版本
go get github.com/gin-gonic/gin@latest # 拉最新版
go mod tidy # 按代码里的 import 对齐依赖:补缺的、删没用的和 npm 的关键差异(先建立直觉):
- 没有
node_modules。依赖不进项目目录,而是下载到全局缓存GOMODCACHE(默认~/go/pkg/mod),多个项目共享同一份。所以不用每个项目各装一遍,也不会有动辄几百 MB 的node_modules。 - 包名就是仓库地址。
github.com/gin-gonic/gin既是 import 路径也是下载地址,没有 npm 那种中央短名注册表;proxy 只是缓存加速,不是必经的注册中心。 - 版本靠 Git tag,形如
v1.9.1,遵循语义化版本。主版本升到v2及以上时,会体现在 import 路径末尾(.../v2)。
go.sum 是干什么的:
github.com/gin-gonic/gin v1.9.1 h1:... # 模块内容的哈希
github.com/gin-gonic/gin v1.9.1/go.mod h1:... # 它的 go.mod 的哈希它记录每个依赖版本的内容哈希,作用类似 package-lock.json 的完整性校验:下次拉同一版本时比对哈希,防止依赖被人悄悄改过。go.mod 和 go.sum 都要提交进仓库。
拉不到依赖时,按这个顺序排查:
go本身没跑起来(command not found)→ 回第二、三节,先把 shell 和 PATH 弄对。- 网络问题(卡住 / 超时)→ 配
GOPROXY=https://goproxy.cn,direct(第四节)。 - 私有仓库(公司 GitLab 等)→
go env -w GOPRIVATE=git.mycorp.com,让它跳过公共代理和校验,再配好对应的 git 凭证。 - 想离线构建 / 锁死依赖 →
go mod vendor把依赖拷进项目的vendor/,CI 里用go build -mod=vendor。
常用命令速查:
go mod init <module-path> # 初始化模块
go get <pkg>@<version> # 加 / 改依赖
go mod tidy # 对齐、清理依赖
go list -m all # 列出所有依赖及版本
go mod download # 只下载依赖到缓存(Dockerfile 里常见)
go clean -modcache # 清空模块缓存(谨慎)面试要点:Go 依赖不落
node_modules,而是「全局模块缓存 +go.mod/go.sum」;包名即仓库地址,版本用 Git tag;go mod tidy负责对齐依赖,go.sum负责完整性校验。
六、一次跑通(新手自检清单)
把前面几节串成一条最短路径:
go version # 1. go 能跑(PATH 配对了)
go env -w GOPROXY=https://goproxy.cn,direct # 2. 配好代理(国内网络)
mkdir hello && cd hello
go mod init example.com/hello # 3. 建模块
go get github.com/google/uuid # 4. 加个依赖试试写个 main.go 用一下这个依赖,然后:
go mod tidy # 5. 对齐依赖
go run . # 6. 跑起来六步都过,环境就算配通了。接下来语法怎么写,进 01-入门与语法。
评论