1244 字
约 4 分钟
5
S09-B01 · Go 的定位、安装与第一个程序
2024-12-31
2026-11-07

适用读者:第一次写 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

  1. 运行 .msi,默认装到 C:\Program Files\Go。
  2. 安装器会自动把 C:\Program Files\Go\bin 加进 PATH(这是与 Python/Java 不同的一点,省心)。
  3. 验证: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. 自检

  1. Go 的"单二进制部署"具体省掉了什么?
  2. GOCACHE 缺失时报什么错?怎么修?
  3. go run、go build、go install 分别做什么?
  4. 为什么说 Go 的极简是"收敛选择"?
  5. 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)。

S09-B01 · Go 的定位、安装与第一个程序
https://www.clxhxhhr.top/posts/5299/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。