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

  1. 访问 https://go.dev/dl/ 下载对应操作系统的安装包。
  2. 运行安装程序,默认安装路径为 /usr/local/go(Linux/Mac)或 C:\Go(Windows)。
  3. 配置环境变量:将 /usr/local/go/bin 添加到 PATH。
  4. 验证安装:打开终端执行 go version,应输出类似 go version go1.21.5 linux/amd64。

2.3.2 IDE 配置(以 VS Code 为例)

  1. 安装 VS Code 后,搜索并安装 Go 扩展(由 Go 团队官方维护)。
  2. 打开任意 Go 文件,VS Code 会自动提示安装 gopls(语言服务器)、dlv(调试器)等工具,点击“Install All”。
  3. 配置 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 微服务架构图

下图展示了当前微服务的内部组件与外部交互关系:

Go 微服务架构图(订单服务 v0.1) 外部客户端 HTTP 路由器 /health 处理器 /order 处理器 JSON 编码/解码 JSON 编码/解码 日志输出 说明:当前微服务仅包含 HTTP 层与 JSON 处理,后续章节将加入数据库、事件总线与分布式事务协调器

2.6 本章小结

通过本章学习,我们完成了以下关键任务:

  • 回顾了 Go 语言的五大核心特性及其在订单系统中的应用场景。
  • 理解了 GOPATH 与 Go Modules 的演进历史,并确认使用 Modules 模式。
  • 完成了 Go 环境安装与 VS Code IDE 配置。
  • 编写并运行了第一个 Go 微服务,验证了 HTTP 路由与 JSON 处理能力。