2. Go 语言环境搭建:安装 Go、配置 GOPATH、Go Modules、开发工具推荐
咱们准备搞国密 SM2,第一件事就是把 Go 的窝搭好。Go 的环境搭建不算复杂,但一些细节容易踩坑。我刚开始接触 Go 的时候,就在 GOPATH 和 Modules 的切换上迷糊过一阵。今天把这块彻底理清,后面写 SM2 签名验签代码才顺溜。
2.1 安装 Go:选择版本与操作系统
安装 Go 其实就三步:下载、解压、配路径。
2.1.1 版本选择
我个人习惯用最新的稳定版。可以访问 Go 官方下载页,找那个看起来最正式的版本号,比如 1.21.x 或 1.22.x。做国密开发不建议追 too young 的 RC 版,万一有编译器 bug,搞签名验签时定位问题很痛苦。
2.1.2 各系统安装方式
| 操作系统 | 安装方式 | 备注 |
|---|---|---|
| Linux (amd64) | 下载 tar.gz → 解压到 /usr/local | 记得配 /etc/profile 或 ~/.bashrc |
| macOS (Intel/M1) | 下载 pkg 包双击安装 | 或者用 brew install go |
| Windows | 下载 msi 安装包默认下一步 | 安装路径不要带中文和空格 |
Linux 上我推荐手动解压,路径可控。比如:
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
记得删掉旧的 /usr/local/go 目录,直接覆盖会留下垃圾文件。
2.1.3 验证安装
打开终端,输入:
go version
看到类似 go version go1.22.0 linux/amd64 就对了。
2.2 环境变量配置:GOROOT 与 GOPATH 的演变
早期 Go 开发者对 GOPATH 感情复杂。Module 出来后,事情简化了不少。
2.2.1 GOROOT
GOROOT 指向 Go 安装根目录。如果装到了 /usr/local/go,一般不用手动设,go 命令能自己找到。我在 Windows 上碰到过一次路径识别失败,只好手动加:
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
2.2.2 GOPATH 的今与昔
老项目还在用 GOPATH。那时候你得把所有代码放在 $GOPATH/src 下,版本管理非常原始。
现在用 Go Modules,GOPATH 基本退化为「下载缓存目录」。具体来说:
- 编译的缓存会放
$GOPATH/pkg/mod - 编译中间文件会放
$GOPATH/pkg - 可执行文件会放
$GOPATH/bin
我习惯把 GOPATH 设成一个独立目录,比如 ~/go,方便清理。千万别把 GOPATH 和 GOROOT 设成同一个目录,那是灾难。
2.3 Go Modules:现代依赖管理
Go Modules 是官方钦定的依赖管理方案。从 Go 1.11 开始引入,1.16 默认开启。说白了,你只需要在项目根目录里放一个 go.mod 文件。
2.3.1 初始化模块
mkdir sm2project
cd sm2project
go mod init sm2project
这会生成 go.mod,里面写着模块名和 Go 版本。后面你只要 go get 拉依赖,go.mod 和 go.sum 会自动更新。
2.3.2 GO111MODULE 环境变量
这个变量控制模块开关:
| 值 | 行为 |
|---|---|
| on | 强制使用 Modules,忽略 GOPATH |
| off | 回到传统 GOPATH 模式 |
| auto (默认) | 项目根目录有 go.mod 就用 Modules,否则 GOPATH |
做 SM2 项目,我建议直接设成 on,省得迷糊:
export GO111MODULE=on
把这一行加到你终端的配置文件里,一劳永逸。
2.3.3 代理设置
为啥要设代理?因为 go get 默认从 Google 服务器拉代码,国内网络你懂的。设置方法:
go env -w GOPROXY=https://goproxy.cn,direct
这样依赖会先走国内镜像,镜像没有的直接去源头拉。我平时还设了:
go env -w GONOSUMDB=*
go env -w GONOSUMCHECK=*
这两个变量关掉 sumdb 校验,在一些内网环境很管用。
go mod init,然后 go mod tidy。tidy 会自动拉取缺失的依赖并删除没用的,是保持 go.mod 干净的好习惯。
2.4 开发工具推荐
工欲善其事,必先利其器。我主推 VS Code 和 GoLand,各有千秋。
2.4.1 VS Code + Go 插件
优点:免费、轻量、插件生态强。装好 VS Code 后,搜「Go」插件,安装官方的那个(作者是 gopls 团队)。
关键配置:
- 设置
"go.useLanguageServer": true,自动补全和跳转会快很多。 - 启用
go.inferGopath,在 Module 项目里自动识别包路径。 - 装一个
Go Test Explorer插件,跑 SM2 单元测试时直接点按钮,比敲命令爽。
我遇到过一个问题:VS Code 在 Mac M1 上偶尔会卡在 gopls 更新上。解决办法是手动安装:
go install golang.org/x/tools/gopls@latest
2.4.2 GoLand
JetBrains 家的,收费但功能强大。开箱即用的智能提示、重构、调试。如果你公司有预算,或者你懒得折腾配置,GoLand 是很省心的选择。不过做国密相关开发,我注意过 GoLand 的默认代码检查不会识别 SM3/SM4 这些库名,需要自己加个 //nolint 或者调一下检查规则。
2.4.3 辅助工具
| 工具 | 用途 | 安装方式 |
|---|---|---|
| golangci-lint | 代码静态检查 | go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest |
| dlv | 调试器 | go install github.com/go-delve/delve/cmd/dlv@latest |
| mockgen | 生成 mock 接口 | go install go.uber.org/mock/mockgen@latest |
| gotests | 自动生成测试代码 | go install github.com/cweill/gotests/gotests@latest |
这些工具多装几个不亏。写国密时,我会用 golangci-lint 跑一遍,检查有没有不小心引入标准库的 hash.Hash 实现冲突。
2.5 本章知识体系一览
下面的 SVG 图把整个搭建流程和关键决策点串起来了,一眼就能看清脉络。
main.go 跑 fmt.Println("hello sm2"),测试从编译到运行的整条链路通不通。等后面真正上手 SM2 时,任何搭建的隐患都会被放大——你不想在调试签名验签时,突然发现是环境变量配错了吧?