2. Go 语言基础回顾与环境搭建
本章将快速回顾 Go 语言的核心特性,并完成从环境安装到第一个微服务启动的全流程。这是整个分布式事务订单系统的基石,确保每位学员拥有一致的开发环境与语言认知。
2.1 Go 语言核心特性回顾
Go 语言(Golang)由 Google 于 2009 年发布,专为现代分布式系统与云原生架构设计。其核心特性可归纳为以下五点:
| 特性 | 描述 | 在订单系统中的价值 |
|---|---|---|
| 并发原语 | goroutine(轻量级线程)与 channel(通信机制) | 同时处理大量订单请求、异步事件处理 |
| 静态类型与编译 | 编译为单一二进制,无运行时依赖 | 微服务部署简单,镜像体积小 |
| 内置垃圾回收 | 低延迟 GC,适合高并发场景 | 避免内存泄漏,保障订单服务稳定性 |
| 标准库丰富 | net/http、encoding/json、database/sql 等 | 快速构建 HTTP API 与数据序列化 |
| 跨平台编译 | GOOS/GOARCH 环境变量支持交叉编译 | 开发 Mac/Linux,部署 Linux 容器 |
提示: 本课程所有代码均使用 Go 1.21+ 版本,请确保安装版本不低于 1.21,以支持最新的语言特性与工具链。
2.2 GOPATH 与 Go Modules 演进
Go 的依赖管理经历了两个重要阶段。理解其演进有助于避免常见配置陷阱。
2.2.1 GOPATH 模式(Go 1.11 之前)
- 所有 Go 代码必须放在
$GOPATH/src目录下。 - 依赖通过
go get下载到$GOPATH/src,版本管理困难。 - 不同项目无法使用同一依赖的不同版本。
2.2.2 Go Modules 模式(Go 1.11+,1.16 默认启用)
- 项目根目录包含
go.mod文件,声明模块路径与依赖。 - 支持语义化版本控制(SemVer),精确锁定依赖版本。
- 不再依赖
GOPATH,项目可放在任意目录。
避坑指南: 本课程所有项目均使用 Go Modules。请确保环境变量
GO111MODULE 设置为 on 或留空(默认值)。如果遇到 cannot find module 错误,请先检查 go.mod 文件是否存在。
以下表格对比两种模式的关键差异:
| 对比维度 | GOPATH 模式 | Go Modules 模式 |
|---|---|---|
| 项目位置 | 必须在 $GOPATH/src 下 |
任意目录 |
| 版本管理 | 无版本概念,依赖最新版 | go.mod + go.sum 精确锁定 |
| 依赖目录 | $GOPATH/pkg/mod(全局) |
$GOPATH/pkg/mod(缓存) |
| 多项目兼容 | 冲突频繁 | 每个项目独立版本 |
| 推荐使用 | 不推荐 | 强烈推荐 |
2.3 安装 Go 与 IDE 配置
2.3.1 安装 Go
- 访问
https://go.dev/dl/下载对应操作系统的安装包。 - 运行安装程序,默认安装路径为
/usr/local/go(Linux/Mac)或C:\Go(Windows)。 - 配置环境变量:将
/usr/local/go/bin添加到PATH。 - 验证安装:打开终端执行
go version,应输出类似go version go1.21.5 linux/amd64。
2.3.2 IDE 配置(以 VS Code 为例)
- 安装 VS Code 后,搜索并安装 Go 扩展(由 Go 团队官方维护)。
- 打开任意 Go 文件,VS Code 会自动提示安装
gopls(语言服务器)、dlv(调试器)等工具,点击“Install All”。 - 配置
settings.json推荐项:
{
"go.gopath": "",
"go.goroot": "/usr/local/go",
"go.useLanguageServer": true,
"go.autocompleteUnimportedPackages": true,
"editor.formatOnSave": true
}
提示: 如果使用 GoLand(JetBrains),安装后即可直接使用,内置了完整的 Go 工具链支持。本课程示例以 VS Code 为主,但所有操作在 GoLand 中同样适用。
2.4 编写第一个 Go 微服务
我们将创建一个简单的 HTTP 微服务,作为订单系统的起点。该服务暴露一个 /health 端点用于健康检查,以及一个 /order 端点用于接收订单创建请求。
2.4.1 初始化项目
mkdir order-service
cd order-service
go mod init github.com/yourname/order-service
2.4.2 编写主程序
创建 main.go 文件:
package main
import (
"encoding/json"
"log"
"net/http"
)
// Order 订单结构体
type Order struct {
ID string `json:"id"`
Amount float64 `json:"amount"`
Status string `json:"status"`
}
func main() {
http.HandleFunc("/health", healthHandler)
http.HandleFunc("/order", orderHandler)
log.Println("Order service starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
}
func orderHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var order Order
if err := json.NewDecoder(r.Body).Decode(&order); err != nil {
http.Error(w, "Bad request", http.StatusBadRequest)
return
}
order.Status = "created"
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(order)
}
2.4.3 运行与测试
go run main.go
打开另一个终端,使用 curl 测试:
# 健康检查
curl http://localhost:8080/health
# 输出: {"status":"ok"}
# 创建订单
curl -X POST http://localhost:8080/order \
-H "Content-Type: application/json" \
-d '{"id":"ORD001","amount":99.50}'
# 输出: {"id":"ORD001","amount":99.5,"status":"created"}
关键点: 这个微服务虽然简单,但包含了 Go 微服务的核心骨架:HTTP 路由、JSON 序列化/反序列化、结构体定义、日志输出。后续章节将在此基础上添加分布式事务、事件风暴画布等复杂逻辑。
2.5 Go 微服务架构图
下图展示了当前微服务的内部组件与外部交互关系:
2.6 本章小结
通过本章学习,我们完成了以下关键任务:
- 回顾了 Go 语言的五大核心特性及其在订单系统中的应用场景。
- 理解了 GOPATH 与 Go Modules 的演进历史,并确认使用 Modules 模式。
- 完成了 Go 环境安装与 VS Code IDE 配置。
- 编写并运行了第一个 Go 微服务,验证了 HTTP 路由与 JSON 处理能力。