适用读者:第一次写 Go 的人。本系列第一篇。
前置:S01-B02(环境变量心智)。
实测环境:Go 1.22.2 / Ubuntu 24.04.1(安装与运行均为 2026-11-05 实测)。
覆盖旧文:A-1438(63) A-1439(23) A-1440(41) A-1441(22) A-1442(34) A-1443(22) A-1444(35) = 240 点。
覆盖扩展:E-S09-001(GOPATH / GOCACHE / GOMODCACHE)。
下一篇:S09-B02 · 变量与基本类型。
1. 一句话结论
Go 的定位是"工程语言":静态编译成单个二进制、内置并发原语、语法极简。它的极简不是"能力少",而是"把选择收敛到一种写法"。
| 对比项 | Go | Java | Python |
|---|---|---|---|
| 编译产物 | 单个静态二进制 | jar + JVM | 解释执行 |
| 部署依赖 | 无(除 libc 变体) | 需 JVM | 需解释器 + 包 |
| 语法自由度 | 低(一种 for、一种格式) |
中 | 高 |
| 并发原语 | goroutine + channel(内置) | 线程 + 线程池 | GIL 限制 |
| 启动速度 | 毫秒级 | 秒级 | 毫秒级 |
"单二进制"的实际价值:把 go build 产物 scp 到服务器就能跑——不需要装运行时、不需要配 classpath。这是容器时代 Go 流行的重要原因。
2. 下载与三平台安装
2.1 官方下载
下载页 https://go.dev/dl/,选对应平台的包(.msi / .pkg / .tar.gz)。
2.2 Windows
- 运行
.msi,默认装到C:\Program Files\Go。 - 安装器会自动把
C:\Program Files\Go\bin加进 PATH(这是与 Python/Java 不同的一点,省心)。 - 验证:
go version。
2.3 Linux
# 下载后解压到 /usr/local
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
# 加入 PATH(写入 ~/.profile 或 ~/.bashrc)
export PATH=$PATH:/usr/local/go/bin
go version
实测(apt 安装方式):
$ go version
go version go1.22.2 linux/amd64
2.4 macOS
brew install go # 或下载 .pkg
go version
"装完 go: command not found"的两个原因:
| 原因 | 检查 | 修法 |
|---|---|---|
| PATH 没加 | echo $PATH | grep go |
加 /usr/local/go/bin |
| 装了但没重开终端 | which go |
重开或 source ~/.profile |
3. 三个目录:GOPATH / GOCACHE / GOMODCACHE(E-S09-001)
$ go env GOPATH GOCACHE GOMODCACHE
/root/go
/root/.cache/go-build
/root/go/pkg/mod
| 变量 | 存什么 | 何时需要关心 |
|---|---|---|
| GOPATH | 工作区根(旧模式遗留) | 很少直接改 |
| GOCACHE | 编译缓存(加速重复构建) | CI 里要缓存它;CI 容器里 HOME 未设会报 build cache is required |
| GOMODCACHE | 下载的依赖(pkg/mod) |
离线构建、清理磁盘 |
实测踩坑:在无 HOME 的容器里跑 go run 会直接失败:
build cache is required, but could not be located: GOCACHE is not defined
and neither $XDG_CACHE_HOME nor $HOME are defined
修法:export HOME=/root GOCACHE=/tmp/gocache GOPATH=/tmp/gopath(CI 里必须显式设置)。这一条旧文完全没有,是新版本/容器环境下的高频问题。
4. 第一个程序
// hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, Go")
}
$ go run hello.go
Hello, Go
$ go build -o hello hello.go
$ ./hello
Hello, Go
$ ls -lh hello
-rwxr-xr-x 1 root root 2.1M hello # 单个静态二进制
go run 与 go build 的区别:
| 命令 | 行为 | 用途 |
|---|---|---|
go run |
编译到临时目录并执行 | 开发期快速验证 |
go build |
产出二进制到当前目录 | 交付 |
go install |
安装到 $GOBIN/$GOPATH/bin |
装工具 |
5. 一个强制约定:gofmt
$ gofmt -l . # 列出格式不规范的文件(输出为空=全部合规)
$ gofmt -w . # 就地格式化
Go 没有"风格之争":gofmt 是唯一格式,编辑器保存时自动跑。这是"收敛选择"的典型例子。
6. 五个误区
| 误区 | 真相 |
|---|---|
| "Go 需要运行时" | 编译产物是静态二进制(除 cgo/libc 依赖) |
"go run 会留下二进制" |
它编译到临时目录,不留产物 |
| "GOPATH 必须配置" | 模块模式(go.mod)下基本不用管 |
"CI 里 HOME 无所谓" |
无 HOME 会导致 GOCACHE 缺失、构建失败(实测) |
| "格式可以团队自定" | gofmt 是唯一标准,团队自定会被工具链拒绝 |
7. 自检
- Go 的"单二进制部署"具体省掉了什么?
GOCACHE缺失时报什么错?怎么修?go run、go build、go install分别做什么?- 为什么说 Go 的极简是"收敛选择"?
gofmt -l .输出为空说明什么?
8. 下一篇
S09-B02 · 变量与基本类型:为什么 len("中文") 是 6 不是 2
下一篇从字符串入手:Go 的字符串是只读字节序列,不是字符数组——这一条决定了后面所有的坑。
本篇属于系列《S09 · Go 语言》。旧文来源:A-1438–A-1444;扩展点 E-S09-001。安装与运行均为 Go 1.22.2 实测(2026-11-05)。