应选官网下载的 go1.23.x 最新稳定版,避免系统包管理器安装;macos/linux 解压至 /usr/local/go,windows 用 msi 一键安装并自动配置环境变量;验证 go version 输出含 go1.23.0 及平台标识。

go version 选最新稳定版,别碰系统包管理器装的
你现在装 Go,唯一该关心的是:用 go1.22.x 还是 go1.23.x?答案很直接——选官网下载页标着“Stable”的最新版本。截至 2026 年 7 月,就是 go1.23.0(或后续补丁版)。它已通过 CNCF 生态大规模验证,标准库、go tool 和模块解析全部对齐。
千万别用 apt install golang、brew install go 或 Windows 的 Chocolatey 装。这些渠道版本普遍滞后 1–2 个大版本,且默认把 GOROOT 指向非标准路径(比如 /usr/lib/go),后续你跑 go build -o bin/app 时会莫名报 cannot find module providing package,查半天才发现是 GOPATH 和 GOROOT 错位。
- macOS/Linux:去
go.dev/dl下载go1.23.0.darwin-arm64.tar.gz或对应架构包,解压到/usr/local/go - Windows:下
go1.23.0.windows-amd64.msi,一路 Next,它会自动设好%GOROOT%和%PATH% - 验证:终端敲
go version,输出必须含go1.23.0和你的平台标识(如linux/amd64)
go mod init 不要硬写 $GOPATH/src
Go 1.16+ 默认启用模块模式,GOPATH 已退居二线。新手常犯的错,是还在项目根目录执行 go mod init github.com/yourname/project 前,先 cd 进 $GOPATH/src/github.com/yourname/project ——这纯属浪费时间,还容易触发 go: inconsistent vendoring 报错。
正确姿势:随便找个干净目录(比如 ~/dev/myapp),直接 go mod init myapp。模块名不一定要带域名,只要全局能区分就行。Go 会自动生成 go.mod,里面第一行是 module myapp,不是 module github.com/xxx。
- 如果你真要发布到 GitHub,后期用
go mod edit -module github.com/yourname/myapp改就行 -
go mod tidy会自动拉依赖,但注意:它只处理import语句里实际用到的包,没引用的不会进go.sum - 别手动改
go.sum,校验失败时删掉重跑go mod tidy
go run 和 go build 的边界必须划清
go run main.go 是调试利器,但别把它当部署手段。它每次执行都重新编译,不生成二进制,且无法注入构建参数(比如版本号)。而 go build -o app 才是生产起点。
关键差异在链接阶段:go run 用临时目录编译,go build 输出静态链接文件。后者可直接扔进 Docker 镜像或裸机运行,前者离开源码树就失效。
- 本地快速验证:用
go run .(点号代表当前模块) - 准备交付:用
go build -ldflags="-s -w" -o bin/app(-s去符号表,-w去 DWARF 调试信息,体积直降 30%) - 跨平台构建:Linux 上想打 Windows 包?加
GOOS=windows GOARCH=amd64 go build -o app.exe
go.work 文件只在多模块协作时才需要
单个项目根本不用碰 go.work。它是 Go 1.18 引入的「工作区」机制,专治微服务/SDK 开发中多个 go.mod 相互依赖的场景。比如你同时改 core 和 api 两个模块,又不想每次改完都 go mod publish 再 replace,这时才上 go work init。
日常开发中误建 go.work 的后果:Go 工具链会优先从工作区找模块,导致 go list -m all 显示一堆本地路径,CI 构建时因缺失 go.work 直接失败。
- 判断要不要用:只有当你目录下有 ≥2 个独立
go.mod,且它们之间存在未发布的依赖关系时 - 初始化命令:在父目录执行
go work init,再go work use ./core ./api - CI 环境务必删掉
go.work,改用replace或发布正式版本
go.mod 里一行 replace 写错路径,或是 go build 没加 -ldflags 导致二进制带调试符号塞满容器镜像——这些细节不写进肌肉记忆,迟早得重装一遍环境。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











