Easton Notes
教程GoJS 转 Go

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。
  • 多版本: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~/.zshrcmacOS 默认
bash(macOS)~/.bash_profilemacOS 登录 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。

  1. Go 工具链自己(go 命令)
    • Homebrew 或官方 .pkg 装的:bin 目录一般已在 PATH,通常不用管。
    • Linux 用 .tar.gz 装到 /usr/local/go 的:必须手动把 /usr/local/go/bin 加进 PATH,否则 go 都敲不出来。
  2. 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约等于全局包目录
GOBINgo install 产物目录空 → $GOPATH/binnpm i -g 的 bin
GOMODCACHE依赖下载后缓存的位置$GOPATH/pkg/mod全局共享版的 node_modules
GOPROXY拉依赖走的代理https://proxy.golang.org,directnpm registry
GOSUMDB校验依赖哈希的校验和数据库sum.golang.org类似 lock 的完整性校验
GOPRIVATE哪些路径算私有、跳过代理和校验空私有 registry / scope

国内网络下最常改的是 GOPROXY:

go env -w GOPROXY=https://goproxy.cn,direct

goproxy.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 都要提交进仓库。

拉不到依赖时,按这个顺序排查:

  1. go 本身没跑起来(command not found)→ 回第二、三节,先把 shell 和 PATH 弄对。
  2. 网络问题(卡住 / 超时)→ 配 GOPROXY=https://goproxy.cn,direct(第四节)。
  3. 私有仓库(公司 GitLab 等)→ go env -w GOPRIVATE=git.mycorp.com,让它跳过公共代理和校验,再配好对应的 git 凭证。
  4. 想离线构建 / 锁死依赖 → 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-入门与语法。

评论

On this page