Skip to content
LawrenceTL92Public

About

Java 工程师的 Go 全栈转型指南:7 部分文档 + 21 个渐进式项目

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

java2go

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 为什么存在

先建立预期,再碰语法。这一部分没有章节练习,也没有配套项目。

教程 内容
Go 为什么会诞生 2007 年 Google 的现场、45 分钟构建、三人设计方法
主要解决哪些问题 构建、依赖、并发、单文件交付、大团队下的语言复杂度
适合哪些场景 主场与边界;对照 Java、C++、Python、Node、Rust、C#

第一部分:Go 语言基础

补齐语法,理解 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 对比

第四部分:CLI 工具与标准库

用 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

第五部分:HTTP 服务与数据持久化

对标 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/          # 参考答案(含同一份测试,证明答案真的通过)

建议流程:

  1. 读 README.md 理解需求
  2. 先跑 go test ./... —— 它是红的,这是故意的,失败的测试就是你的任务清单
  3. 在骨架文件的 TODO 处写实现,反复跑测试直到转绿
  4. 卡住了看 solution/
  5. 根据项目 README 运行 demo;多数 demo 可在学习者实现和 solution 之间选择
  6. 试试 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。

License

MIT,见 LICENSE。


java2go —— 从 Java 到 Go,不只是换个语言,而是换掉那套「用类型层次解决一切」的本能。

About

Java 工程师的 Go 全栈转型指南:7 部分文档 + 21 个渐进式项目

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages