Java 工程师的 Go 全栈转型指南
Go 的语法两天就能读完——它刻意做得小。真正的挑战在于思维方式的转变:组合替代继承、接口隐式实现、错误是值而不是控制流、用 channel 通信而不是用锁保护共享内存。
这个仓库帮你用 Java 的视角理解 Go,用最短时间完成从 Spring Boot 到 Go 后端与云原生基础设施的切换。
- Java 对照学习 —— Spring Boot / JPA / Maven / JUnit / 线程池,每个都有等价对比
- 21 个渐进式项目 —— 从 CLI 小工具到 Reconcile 模型与多模块工程化
- 100 道章节练习 —— 93 道已配题目骨架与参考答案,7 道外部工具链实验明确暂缓
- 测试驱动练习 —— 骨架里写 TODO,预置的 table-driven 测试就是验收标准,跑绿即通关
- 云原生纵深 —— gRPC、容器化、Operator,Go 最难被 Java 替代的领域
- 标准库优先 —— 先用
net/http和database/sql讲透原理,再引入 gin/GORM 做对照
语法可以查文档,这四件事得先在脑子里转过来:
| Java 习惯 | Go 的做法 |
|---|---|
设计类层次结构,extends 复用 |
没有继承,只有结构体嵌入与组合 |
implements 显式声明契约 |
接口隐式满足,且由消费方定义 |
抛异常,try/catch 兜底 |
错误是普通返回值,if err != nil 显式处理 |
| 线程池 + 锁保护共享状态 | goroutine + channel 传递数据所有权 |
.
├── docs/ # 教程文档
│ ├── part0-why-go/ # 第零部分:Go 为什么存在(无练习)
│ ├── part1-go-basics/ # 第一部分:Go 语言基础
│ ├── part2-types-interfaces/ # 第二部分:类型系统与接口
│ ├── part3-concurrency/ # 第三部分:并发编程
│ ├── part4-cli-stdlib/ # 第四部分:CLI 工具与标准库
│ ├── part5-backend-api/ # 第五部分:HTTP 服务与数据持久化
│ ├── part6-cloud-native/ # 第六部分:云原生与微服务
│ └── part7-production/ # 第七部分:工程化与可观测性
│
├── projects/ # 实践项目(大多数是独立 module)
│ ├── 01-directory-tree/
│ ├── 02-json-merger/
│ ├── ...
│ └── 21-production-monorepo/
│
├── exercises/ # 章节练习(starter / solution)
│ ├── part1-go-basics/
│ ├── ...
│ └── manifest.tsv # 100 道题的实施/暂缓状态
│
└── go.work # 工作区,串起全部项目
先建立预期,再碰语法。这一部分没有章节练习,也没有配套项目。
| 教程 | 内容 |
|---|---|
| Go 为什么会诞生 | 2007 年 Google 的现场、45 分钟构建、三人设计方法 |
| 主要解决哪些问题 | 构建、依赖、并发、单文件交付、大团队下的语言复杂度 |
| 适合哪些场景 | 主场与边界;对照 Java、C++、Python、Node、Rust、C# |
补齐语法,理解 Go 与 Java 在内存模型和错误处理上的根本差异。
| 教程 | 内容 |
|---|---|
| 环境与工程结构 | go mod、package 与可见性、internal/ |
| 核心语法差异 | 零值、值类型与指针、slice/map、多返回值 |
| 错误处理 | error 接口、%w 包装、errors.Is/As/AsType、defer/panic |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 1 | 目录树生成器 | 递归遍历目录,输出树形结构 |
| 2 | JSON 配置合并工具 | 深度合并多个 JSON 配置 |
| 3 | 批量文件重命名器 | 按规则批量重命名,支持预览模式 |
Go 最反 Java 直觉的部分:没有继承,接口反着用。
| 教程 | 内容 |
|---|---|
| struct 与组合 | 嵌入、方法提升、值/指针接收者 |
| 接口 | 隐式实现、小接口哲学、类型断言、nil 陷阱 |
| 泛型 | 类型参数、约束、slices/maps 包 |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 4 | 泛型集合工具库 | Map/Filter/Reduce/GroupBy,对标 Java Stream |
| 5 | 泛型 LRU 缓存 | 支持 TTL 与容量淘汰的类型安全缓存 |
| 6 | 插件式数据导出器 | 一份数据导出为 CSV/JSON/表格 |
Go 的杀手级特性,也是最需要重建直觉的一部分。
| 教程 | 内容 |
|---|---|
| goroutine 与调度器 | GMP 模型、泄漏排查、对比虚拟线程 |
| channel 与 select | CSP 思维、pipeline、fan-in/fan-out、限流 |
| sync 与 context | Mutex/atomic、取消传播、errgroup、-race |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 7 | 并发网页抓取器 | 并发抓取 + 信号量限流 + 结果聚合 |
| 8 | 工作池与任务调度器 | worker pool + context 取消 + 优雅退出 |
| 9 | 并发安全指标聚合器 | Mutex/atomic/sync.Map 三种实现 benchmark 对比 |
用 Go 写实际可用的命令行工具,顺带补齐测试体系。
| 教程 | 内容 |
|---|---|
| 标准库核心 | os/io/fs、filepath、os/exec、encoding/json、embed |
| CLI 开发 | flag、cobra/viper、log/slog、单二进制交付 |
| 测试 | table-driven、子测试、httptest、benchmark、fuzzing |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 10 | 代码行数统计工具 | 按语言统计代码/注释/空行 |
| 11 | 项目脚手架生成器 | cobra + text/template + embed |
| 12 | Git 提交日志整理器 | 解析 Conventional Commits 生成 CHANGELOG |
对标 Spring Boot 体系,先讲原理再讲框架。
| 教程 | 内容 |
|---|---|
| HTTP 服务 | Handler 接口、ServeMux 路由、中间件、优雅关闭 |
| 数据持久化 | database/sql 连接池、事务、迁移、GORM 对照 |
| API 规范与安全 | validator、JWT、配置管理、gin 对照 |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 13 | RESTful 书签 API | 标准库 HTTP 为主,内存 CRUD 与中间件 |
| 14 | 待办事项数据层 | SQLite + 嵌入式迁移 + 事务 |
| 15 | 带认证的笔记 API | 注册登录 + JWT + 数据隔离,附 gin 重写版对照 |
Docker、Kubernetes、etcd、Prometheus 都是 Go 写的。这是 Go 最难被替代的领域。
| 教程 | 内容 |
|---|---|
| gRPC 与 Protobuf | proto 定义、代码生成、流式 RPC、拦截器、Gateway |
| 容器化与部署 | 多阶段构建、distroless、交叉编译、容器感知 GOMAXPROCS |
| Kubernetes 与 Operator | CRD、Reconcile、幂等、controller-runtime 映射 |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 16 | gRPC 笔记服务 | 一元 + 服务端流 RPC + 本地客户端 demo |
| 17 | 容器化与交叉编译 | 多阶段 Dockerfile + distroless + compose |
| 18 | Operator Reconcile 模型 | FakeClient 练习 Observe-Diff-Act 与幂等 |
| 教程 | 内容 |
|---|---|
| 可观测性 | OTel trace、Prometheus 指标、pprof 火焰图 |
| 项目布局与依赖治理 | cmd/internal/pkg、go.work、wire、MVS |
| CI/CD 与发布 | golangci-lint、go fix、Actions、goreleaser、语义化版本 |
实践项目:
| # | 项目 | 说明 |
|---|---|---|
| 19 | 可观测性接入 | 本地可测的 OTel span + Prometheus + pprof |
| 20 | 服务测试工具箱 | 单元 + Handler 集成 + fuzz + benchmark + 覆盖率门槛 |
| 21 | 多模块 Monorepo | 共享 lib + 消费 app + go.work + GoReleaser 快照 |
按顺序阅读 docs/ 下的 Markdown。第零部分是背景,没有练习;第一部分起每篇包含概念讲解、Java 等价代码对比、以及实战练习。
每章末尾链接到 exercises/ 中的配套材料。starter/ 提供函数签名、TODO 或实验步骤,solution/ 提供参考实现、命令和预期现象。确定性代码题带同构测试;性能、故障和仓库操作题使用明确的观测标准。
cd exercises
go test ./part1-go-basics/02-core-syntax/starter # 初始预期为红
go test ./part1-go-basics/02-core-syntax/solution # 参考答案应为绿大多数项目是一个独立 module,采用以下骨架/参考答案结构:
projects/05-lru-cache/
├── README.md # 需求说明、Java 对照、实现提示、扩展挑战
├── go.mod
├── cache.go # 骨架:类型与函数签名 + TODO,你来填充
├── cache_test.go # 预置测试 —— 这就是验收标准
├── cmd/demo/main.go # 可运行的演示入口
└── solution/ # 参考答案(含同一份测试,证明答案真的通过)
建议流程:
- 读
README.md理解需求 - 先跑
go test ./...—— 它是红的,这是故意的,失败的测试就是你的任务清单 - 在骨架文件的 TODO 处写实现,反复跑测试直到转绿
- 卡住了看
solution/ - 根据项目 README 运行 demo;多数 demo 可在学习者实现和
solution之间选择 - 试试 README 里的扩展挑战
cd projects/05-lru-cache
go test ./... # 骨架测试(红)→ 你的任务清单
go test ./solution/... # 参考答案测试(绿)
go run ./cmd/demo项目 21 例外:它专门用 lib 和 app 两个 module 演示 workspace 协作。
仓库根目录有 go.work 串起所有 module,用 scripts/check.sh 跨模块检查:
./scripts/check.sh # 全部强制检查
./scripts/check.sh build # 只编译全部项目
./scripts/check.sh lint # 只跑 golangci-lint(本地没装则跳过)
./scripts/check.sh docs # 检查 Markdown 本地链接
./scripts/check.sh exercise-coverage # 检查 100 道题的实施/暂缓状态
./scripts/check.sh test-sync # 检查骨架与参考答案测试同步
./scripts/check.sh coverage # 执行项目 20 覆盖率门槛
./scripts/check.sh solutions # 只跑参考答案的测试
./scripts/check.sh exercises # 快速汇总骨架进度,单模块有 15s 超时CI 强制的就是这些。骨架包的测试允许为红——那是留给学习者的任务清单。
想在本地跑 lint 需要装一次:
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest顺带说明一个 go.work 的真实限制:在工作区根目录跑 go build ./... 是会失败的,因为根目录本身不属于任何 module,Go 会报 directory prefix . does not contain modules listed in go.work。跨模块的正确做法是用 go list -m 拿到模块目录再逐个进去执行,这也是 scripts/check.sh 干的事。
- 熟悉 Java 编程(Spring Boot / JPA / 并发经验更佳)
- Go 1.26+(
new(expr)、errors.AsType等特性依赖此版本) - Git
部分项目需要额外工具,各自 README 里有说明:
| 项目 | 额外依赖 |
|---|---|
| 16 gRPC 笔记服务 | 只在修改 proto 并重新生成时需要 protoc 及 Go 插件 |
| 17 容器化 | 只有实际构建镜像时需要 Docker / Docker Compose |
| 18 Reconcile 模型 | 无额外依赖,默认不需要 Kubernetes 集群 |
| 19 可观测性 | 无额外服务,测试使用内存 OTel exporter |
| 资源 | 说明 |
|---|---|
| Effective Go | 官方惯用法指南 |
| Go Code Review Comments | 社区评审惯例,Go 版《Effective Java》 |
| Go Proverbs | Rob Pike 的设计箴言 |
| Uber Go Style Guide | 工业界规范范本 |
| Learn Go with Tests | TDD 学 Go,与本仓库思路一致 |
| 标准库参考 | Go 的标准库比你想象的够用 |
完整的知识点提纲见 docs/plans/2026-08-05-go-learning-outline.md。
MIT,见 LICENSE。
java2go —— 从 Java 到 Go,不只是换个语言,而是换掉那套「用类型层次解决一切」的本能。