Skip to content
Go
Go 安装与配置

Go 安装与配置

Go 语言跨平台安装、GOROOT/GOPATH 环境变量、模块代理配置、GOTOOLCHAIN 工具链自动切换与开发环境验证。本手册基线为 Go 1.27(2026-08 发布,当前最新稳定版),文中凡标注"实测"的结论均已在 go1.27.0 windows/amd64 工具链上验证。


多平台安装

Windows

方式一:官方安装包

从 go.dev/dl 下载 .msi 安装包(如 go1.27.0.windows-amd64.msi),双击安装。默认安装路径为 C:\Program Files\Go\,安装器会自动把 go 命令加入 PATH。

方式二:Scoop(推荐)

scoop install go

方式三:winget

winget install GoLang.Go

使用包管理器(Scoop/winget)的好处是版本切换和更新方便;配合下文的 GOTOOLCHAIN 机制,机器上其实只需要一份"够新"的 Go,具体项目的工具链版本由 go.mod 决定。

macOS

# Homebrew(推荐)
brew install go

# 官方 pkg 安装包
# 从 go.dev/dl 下载 go1.27.0.darwin-arm64.pkg(Apple Silicon)
# 或 go1.27.0.darwin-amd64.pkg(Intel),双击安装

注意:Go 1.27 要求 macOS 13 及以上(1.26 的发布说明已预告,1.27 正式生效)。更老的 macOS 只能停留在旧版本工具链。

Linux

# 方式一:包管理器(版本通常偏旧,不推荐用于追新版本)
sudo apt install golang-go        # Ubuntu/Debian
sudo yum install golang           # CentOS/RHEL

# 方式二:官方二进制包(推荐,获取最新版本)
wget https://go.dev/dl/go1.27.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.27.0.linux-amd64.tar.gz

# 配置环境变量(追加到 ~/.bashrc 或 ~/.zshrc)
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$HOME/go/bin    # go install 产出的目录,GOPATH 默认即 $HOME/go

GOPATH 一般不需要手动导出——Go 1.8+ 起默认就是 $HOME/go(Windows 上为 %USERPROFILE%\go),只要把 $GOPATH/bin 加进 PATH 即可。

Docker

CI 或临时环境可以直接用官方镜像:

docker run --rm -it -v "$PWD":/src -w /src golang:1.27 go build ./...
docker run --rm -it golang:1.27-alpine go version

golang 镜像有 Debian(默认)与 Alpine 等变体;Alpine 基于 musl libc,涉及 cgo 的构建行为会与 glibc 环境略有差异,纯 Go 项目无影响。

平台支持速览(1.27 基线)

  • macOS 需 13+(Go 1.27 生效)。
  • windows/arm(32 位 ARM)已在 Go 1.26 移除,Windows 上只剩 amd64 与 arm64。
  • linux/ppc64 在 Go 1.27 转为 ELFv2 ABI。
  • 主流目标平台:windows/amd64、windows/arm64、linux/amd64、linux/arm64、darwin/amd64、darwin/arm64。

官方安装包命名与校验

官方下载文件的命名规则固定为:

go<版本>.<GOOS>-<GOARCH>.<扩展名>

go1.27.0.windows-amd64.msi    # Windows 安装器
go1.27.0.windows-amd64.zip    # Windows 免安装解压版
go1.27.0.linux-amd64.tar.gz   # Linux(另有 linux-arm64 等)
go1.27.0.darwin-arm64.pkg     # macOS Apple Silicon(另有 darwin-amd64)
go1.27.0.src.tar.gz           # 源码包

下载后应对照 go.dev/dl 页面上列出的 SHA256 校验值 做完整性检查(sha256sum / Get-FileHash)。校验值随版本发布,请以官网为准,不要把某个具体散列值抄进脚本或文档里长期复用。


GOTOOLCHAIN:按 go.mod 自动切换工具链(Go 1.21+)

Go 1.21 引入了工具链自动下载机制,GOTOOLCHAIN 默认值为 auto(实测 go1.27.0 go env GOTOOLCHAIN 输出 auto)。工作方式:

  • 每个 Go 命令启动时读取当前目录 go.mod 的 go 指令和可选的 toolchain 指令;
  • 如果要求的版本高于本机安装的 Go,go 命令会自动把对应版本当作普通模块(golang.org/toolchain)下载、校验并执行——也就是说,工具链下载走 GOPROXY,国内配好代理后切版本同样很快;
  • 如果要求的版本低于本机版本,直接用本机版本,语言特性由 go 指令门控(与二进制版本无关)。

由此带来的实践变化:机器上不必人人手动对齐 Go 版本。团队统一提交一个带 toolchain 行的 go.mod,成员用任意 1.21+ 的 Go 打开项目就会自动落到约定版本上。

相关取值:

go env -w GOTOOLCHAIN=local   # 强制只用本机工具链,禁止自动下载(离线/安全环境常用)
go env -u GOTOOLCHAIN         # 删除持久化设置,恢复默认 auto

注意:GOTOOLCHAIN=local 下打开要求更高版本的模块会直接报错而不是下载,报错信息会提示你需要升级——这是有意设计,用于让构建环境行为可预测。


核心环境变量

变量 说明 默认值
GOROOT Go 安装根目录 安装时自动检测(如 /usr/local/go),不要手动设置
GOPATH 工作区目录(模块缓存 + go install 安装路径的父目录) $HOME/go(Windows 为 %USERPROFILE%\go)
GOBIN go install 输出的二进制目录 $GOPATH/bin
GOMODCACHE 模块缓存目录 $GOPATH/pkg/mod
GOCACHE 构建缓存目录 按系统(Linux $HOME/.cache/go-build,Windows %LOCALAPPDATA%\go-build)
GOTOOLCHAIN 工具链自动切换策略(Go 1.21+) auto(实测)
GO111MODULE 模块模式开关 on(Go 1.16 起)
GOPROXY 模块代理 URL,逗号分隔依次尝试 https://proxy.golang.org,direct
GOSUMDB 校验和数据库 sum.golang.org
GOPRIVATE 私有模块通配前缀,同时作为下面两项的默认值 空
GONOPROXY 不走代理、直连拉取的模块前缀 空(跟随 GOPRIVATE)
GONOSUMDB 跳过校验和数据库检查的模块前缀 空(跟随 GOPRIVATE)
GOINSECURE 允许 HTTP(非 HTTPS)拉取的模块前缀 空
CGO_ENABLED 是否启用 cgo 1(交叉编译时默认自动置 0)
GOOS / GOARCH 交叉编译目标平台 当前平台
GOEXPERIMENT 实验特性开关,见后文 空
GODEBUG 兼容性行为开关 空

注意:旧文档常见的 GONOSUMCHECK 不是 go 命令的环境变量(实测 go env 输出中不存在该项),它是 Go 1.13 之前 vgo 试验期的产物,看到旧文章引用它直接忽略,正确变量是 GONOSUMDB。

查看与修改:

go env                          # 查看所有环境变量
go env GOPATH GOPROXY GOROOT    # 查看指定变量
go env -w GOPROXY=https://goproxy.cn,direct  # 持久化修改(写入 os.UserConfigDir/go/env 文件)

go env -w 写入的是一个纯文本配置文件(Windows 在 %AppData%\go\env,Linux 在 $HOME/.config/go/env),优先级低于同名真实环境变量,方便 CI 里用环境变量临时覆盖。


GOPATH 模式 vs Modules 模式

维度 GOPATH 模式 Modules 模式
代码位置 必须在 $GOPATH/src/ 下 任意目录
依赖管理 go get 拉取到 $GOPATH/src/ go.mod + go.sum 声明依赖
版本控制 无(默认拉取最新 master) 语义化版本精确控制
现状 仅存遗留价值 默认且唯一推荐方式

注意(纠错):不少旧手册写"Go 1.17+ 已完全移除 GOPATH 模式",这是错误说法。事实是:Go 1.16 起 module 模式成为默认(GO111MODULE=on),但 GO111MODULE=off 至今仍然有效——实测 go1.27.0 下 GO111MODULE=off go run hello.go 正常输出 Hello, Go!。GOPATH 生态在 2023 年后已被主流工具和教程实质弃用,机制保留只是为了老项目能跑,新项目一律使用 Modules。

GO111MODULE 三个值

值 行为
on 强制使用 Modules 模式
off 强制使用 GOPATH 模式
auto 目录含 go.mod 则 Modules,否则 GOPATH(Go 1.15 及之前的默认值)

日常开发不需要显式设置它——1.16 之后默认就是 on。


模块代理(GOPROXY)

配置国内代理

Go 模块代理会缓存上游模块,大幅加速依赖下载。中国大陆网络环境下强烈建议第一步就配置代理:

# Go 1.13+ 支持多个代理,逗号分隔,依次尝试
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct

# 其他可用代理
# https://goproxy.io
# https://mirrors.aliyun.com/goproxy/
# https://goproxy.cn          七牛 CDN,国内使用最广
配置值 说明
https://proxy.golang.org Google 官方代理(国内无法直连)
https://goproxy.cn 七牛 CDN,国内推荐
direct 所有代理都未命中时直连源站(兜底策略)
off 禁止下载模块(GOPROXY=off,用于只用本地缓存的离线构建)

私有模块配置

企业内部私有模块需跳过代理和校验和数据库:

# GOPRIVATE 会同时作为 GONOPROXY 和 GONOSUMDB 的默认值,通常只设这一个就够
go env -w GOPRIVATE=gitlab.mycompany.com,github.com/myorg/*

# 仅当私有仓库走 HTTP(非 HTTPS)时再加:
go env -w GOINSECURE=gitlab.mycompany.com

# 同时配置 Git 凭证,让 go 直连时使用 SSH
git config --global url."ssh://git@gitlab.mycompany.com/".insteadOf "https://gitlab.mycompany.com/"

注意:GOPROXY 末尾的 direct 很关键——它告诉 Go:当所有代理都不可用时,直接访问源站(GitHub/GitLab 等)。如果不加 direct,代理拉不到的模块(往往是私有模块或极新的版本)会直接报错。这也是 GOPRIVATE 匹配私有模块时能绕过代理直连的前提。


GOEXPERIMENT:实验特性开关

GOEXPERIMENT 是编译期实验特性的通道:新版本发布的实验特性,稳定后会移除开关。多个值用逗号分隔,可以 go env -w 持久化,也可以单条命令临时生效:

GOEXPERIMENT=nojsonv2 go build ./...    # 只对这一次构建生效
go env -w GOEXPERIMENT=nosizespecializedmalloc  # 持久化

Go 1.27 基线下常用的几个值:

  • nojsonv2:Go 1.27 中 encoding/json 的行为改由新实现 encoding/json/v2 支撑;设 GOEXPERIMENT=nojsonv2 可退回旧实现,用于升级后排查 JSON 行为差异。
  • nosizespecializedmalloc:1.27 启用的 size-specialized malloc(按大小特化的分配器)让小于 80B 的分配最多快约 30%、真实程序整体约 1%,代价是二进制体积增加约 60KB;对体积敏感可关闭。
  • norandomizedheapbase64:关闭 1.26 引入的 64 位平台堆基址随机化(个别安全扫描或调试场景需要固定地址布局时才用)。

历史上 testing/synctest 在 1.24 靠 GOEXPERIMENT=synctest 提供、1.25 转正式后开关作废——这就是 GOEXPERIMENT 的典型生命周期。另外 1.27 的 simd / simd/archsimd 包目前仍属实验特性,需通过 GOEXPERIMENT 开启(具体开关名以官方 notes 为准)。


go.mod 与 go 指令

新建模块后 go.mod 的典型形态:

module example.com/hello

go 1.27.0

go 指令声明这个模块要求的最低语言版本与标准库版本(Go 1.21 起语义收紧为精确的语言版本门控),可选的 toolchain 指令则进一步钉死使用的具体工具链版本。两者配合上文 GOTOOLCHAIN 的机制使用;GOTOOLCHAIN 与模块系统的详细原理见 01-核心概念.md。

关于 go mod init 生成的默认 go 版本,各版本行为有出入,这里以实测为准:

  • Go 1.26 官方 notes:工具链为 1.N.X 时,go mod init 生成 go 1.(N-1).0(即 1.26 生成 go 1.25.0);
  • 实测 go1.27.0:go mod init hello 直接生成 go 1.27.0,不再有"减一"行为(源码验证:1.27 的 cmd/go/internal/modload/init.go 中 CreateModFile 使用本地完整版本,无减一逻辑)。

注意:go 指令写高的代价是真实的——Go 1.27 起 go test 默认执行 stdversion 检查,模块里引用了高于 go 指令版本的标准库符号会被 vet 报错(例如 go 1.26 的模块用 1.27 新增的顶层 uuid 包会被指出)。新建模块按团队最低运行环境写 go 指令,而不是无脑追最新。


验证安装

# 查看版本
go version
# go version go1.27.0 windows/amd64

# 查看环境
go env
go env GOROOT GOPATH GOPROXY GOTOOLCHAIN

# 创建并运行一个 hello world 测试
mkdir -p /tmp/hello && cd /tmp/hello
go mod init hello

写入 main.go:

package main

import "fmt"

func main() {
	fmt.Println("Hello, Go!")
}
go run main.go
# 输出:Hello, Go!

以上步骤(含 go mod init 生成的 go.mod 内容为 go 1.27.0)已在 go1.27.0 windows/amd64 实测通过。如果只想快速确认旧式 GOPATH 行为还能复现,可加 GO111MODULE=off go run main.go,同样正常输出——但这仅用于理解遗留环境,不要用于新项目。


项目结构(最佳实践)

myproject/
├── go.mod                  # 模块声明 + 依赖
├── go.sum                  # 依赖校验和(自动生成,提交到 VCS)
├── main.go                 # 入口(如果是单命令)
├── cmd/                    # 多命令应用(多个 main 包)
│   ├── server/
│   │   └── main.go
│   └── worker/
│       └── main.go
├── internal/               # 内部包(禁止外部导入)
│   ├── config/
│   ├── handler/
│   └── service/
├── pkg/                    # 可公开导入的库包
│   └── api/
├── api/                    # API 定义(proto / OpenAPI)
├── configs/                # 配置文件
├── test/                   # 集成测试
└── docs/                   # 文档

注意:internal/ 是 Go 的编译器级访问控制——任何包如果路径中含有 internal/,只能被其父目录或其父目录的子包导入。这比 C++/Java 的 private/protected 更严格也更可靠,因为违规是编译错误而不是约定。


编辑器与 IDE 配置

VS Code

  1. 安装 Go 扩展
  2. 安装 Go 工具集:
# Ctrl+Shift+P → "Go: Install/Update Tools" → 全选 → 安装
# 或命令行手动安装
go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@latest
go install honnef.co/go/tools/cmd/staticcheck@latest

GoLand / IntelliJ

内置 Go 支持,无需额外配置。

常用工具清单

工具 用途 安装
gopls Go 语言服务器(LSP:补全/跳转/重构) go install golang.org/x/tools/gopls@latest
dlv Delve 调试器 go install github.com/go-delve/delve/cmd/dlv@latest
staticcheck 高级静态分析(比 go vet 更强) go install honnef.co/go/tools/cmd/staticcheck@latest
goimports 自动格式化 + import 管理 go install golang.org/x/tools/cmd/goimports@latest
golangci-lint 聚合 lint 工具 go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

这些工具装在 $GOBIN(默认 $GOPATH/bin)下,确认该目录在 PATH 中才能直接敲 gopls、dlv。另外 Go 1.27 的 go fix 自带若干 modernizer(如把 wg.Add(1)+go func 改写为 wg.Go),不装任何外部工具也能做基础现代化改写,见 10-版本变迁.md。


快速参考

任务 命令
查看 Go 版本 go version
查看所有环境变量 go env
设置国内代理 go env -w GOPROXY=https://goproxy.cn,direct
设置私有模块 go env -w GOPRIVATE=git.internal.com/*
禁用工具链自动下载 go env -w GOTOOLCHAIN=local
恢复某项默认值 go env -u GOPROXY
初始化新模块 go mod init example.com/myproject
运行代码 go run main.go
编译 go build
安装工具 go install tool@version
格式化代码 gofmt -w . 或 goimports -w .

实战建议

  • 版本管理交给 go.mod:机器上装一份最新稳定版(当前 1.27)就够了;项目锁定版本靠 go / toolchain 指令 + GOTOOLCHAIN=auto,团队不再需要口头对版本。CI 镜像同理,基础镜像装新 Go,实际执行版本由模块文件决定。
  • 装完 Go 第一件事是配 GOPROXY:https://goproxy.cn,direct,国内直连 proxy.golang.org 会超时;末尾的 direct 保留私有模块和兜底能力。
  • 不要手动设置 GOROOT:现代安装方式(msi/pkg/tar/包管理器)都能自动检测,很多"诡异"的编译问题恰恰来自手工 export 了一个指向旧版本的 GOROOT。
  • GOPATH 模式只用来看旧代码,不要用在新项目上:GO111MODULE=off 在 go1.27 仍然可用(实测),但 module 之外没有版本控制、没有可复现构建,2026 年新建仓库坚持 GOPATH 模式只会制造障碍。
  • 内网/隔离环境的组合拳:GOPROXY=off + 预热模块缓存,或 GOTOOLCHAIN=local + 镜像内预置多版本工具链;私有仓库用 GOPRIVATE,确有 HTTP 仓库时才用 GOINSECURE,需要彻底跳过校验和数据库才设 GOSUMDB=off(并知悉这会失去官方完整性校验保护)。
  • 升级大版本后跑一遍 go vet ./...:1.27 的 stdversion、printf 等检查更严格,旧模块升 go 指令前先让 vet 干净,可以提前暴露"引用了超前标准库符号"这类问题。
  • JSON 行为疑疑难杂症:升级 1.27 后若发现序列化输出与旧版不一致,先用 GOEXPERIMENT=nojsonv2 对照验证,确认是 v2 实现差异再决定修数据还是暂时退回开关,见 09-标准库速览.md。