mac上用homebrew装go最省事,先装homebrew并配置对应shell环境变量(zsh改~/.zshrc、bash改~/.bash_profile),再执行brew install go,自动设置goroot;go version验证成功后,强制启用go111module=on,新建项目直接go mod init,无需手动设gopath。

Mac 上用 Homebrew 装 Go 最省事
绝大多数 Mac 用户直接用 brew install go 就能搞定,不用手动下载、拖拽、点下一步。Homebrew 会自动把 go 命令放进 /usr/local/bin,且默认设置好 GOROOT(指向 /opt/homebrew/Cellar/go/x.x.x/libexec 这类路径),你几乎不用碰环境变量。
常见错误现象:command not found: go —— 大概率是 Homebrew 没加进 shell 的 PATH,或者你用的是 zsh 但改了 ~/.bash_profile(而 macOS 默认用 zsh)。检查方法:运行 which brew,如果输出是 /opt/homebrew/bin/brew,那就要改 ~/.zshrc;如果是 /usr/local/bin/brew,才改 ~/.bash_profile。
- 装完立刻验证:
go version,看到类似go version go1.23.1 darwin/arm64就算成功 - 别急着手动设
GOROOT—— Homebrew 安装的版本已内置正确值,硬写反而容易冲突 - 如果公司内网或校园网有代理,先在终端里临时加一句:
export HTTP_PROXY=http://your-proxy:port,否则go mod download可能卡住
GO111MODULE=on 是现在唯一靠谱的模式
Go 1.16 起默认开启模块(module)支持,但旧教程常让你手动关掉或设为 auto。别信——直接强制开:go env -w GO111MODULE=on。这是为了确保你新建项目时,go mod init 能正常生成 go.mod,依赖也能被正确记录和隔离。
为什么必须开:不开的话,go get 会尝试往 $GOPATH/src 写代码,而现代 Go 项目基本不依赖 GOPATH;更麻烦的是,某些包(比如 golang.org/x/tools)在 module 关闭时根本拉不下来,报错像 no required module provides package golang.org/x/tools/go/analysis。
- 验证是否生效:
go env GO111MODULE应输出on - 新建项目时,先进入空目录,再执行
go mod init myapp,别跳过这步 - 如果已有老项目没
go.mod,别直接go mod init覆盖——先备份,再根据实际 import 路径补全模块名
不需要也不建议手动设 GOPATH
从 Go 1.13 开始,GOPATH 对日常开发已非必需。模块模式下,依赖自动存到 $HOME/go/pkg/mod,可执行文件默认输出到当前目录(go run)或 $HOME/go/bin(go install)。除非你要用 go install 把命令行工具全局可用,否则连 $HOME/go/bin 都不用塞进 PATH。
容易踩的坑:网上很多教程仍教你 export GOPATH=$HOME/go,结果导致 go list 或 go build 找错路径,尤其当你同时有多个 Go 项目、又混用 src 目录结构时,go 工具链会困惑该走 module 还是 GOPATH 模式。
- 想确认当前 GOPATH 是什么:
go env GOPATH,它通常就是$HOME/go,但你不需干预 - 如果真要
go install工具(比如gopls或delve),执行后记得加$HOME/go/bin到 PATH,否则终端找不到命令 - VS Code 的 Go 插件会自动读取
go env,只要go命令本身能执行,插件一般不会因 GOPATH 缺失报错
第一个程序别写在 GOPATH/src 里
新手常按老教程,在 ~/go/src/hello/ 下建项目,结果发现 go run main.go 报错:go: cannot find main module。这是因为模块模式下,go 工具不再认 GOPATH/src 为默认项目根,它只认当前目录有没有 go.mod。
正确做法:随便找个干净目录,比如 ~/Desktop/hello,然后 go mod init hello,再写 main.go。这样既符合现代 Go 规范,也避免路径嵌套带来的混淆。
-
package main必须存在,且文件里只能有一个func main() -
fmt.Println("Hello, Go!")的P必须大写,小写会报undefined: fmt.println - 别用中文路径或空格命名目录——
go工具对这类路径偶尔抽风,尤其在 module 解析阶段
真正麻烦的不是装不上 Go,而是早期习惯性配置让后续依赖管理、IDE 识别、CI 构建全跟着偏移。模块模式已经稳定五年,现在还绕着 GOPATH 走,等于主动给自己埋兼容性雷。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











