面向有 7 年 Java 经验的开发者。每一节都会先点出"对应 Java 的什么",再讲 Go 的差异。所有示例都可以独立运行:
cd learning/go-for-java go run ./01_basics go run ./02_control_flow # ...
| # | 文件夹 | 主题 | 对照 Java |
|---|---|---|---|
| 01 | 01_basics | 变量、常量、基础类型、零值、类型转换 | int/String/final/装箱拆箱 |
| 02 | 02_control_flow | if / for / switch / goto |
对应 Java 控制流,但 Go 只有 for |
| 03 | 03_functions | 多返回值、命名返回值、可变参、defer、闭包 | Java 方法 + try-with-resources + Lambda |
| 04 | 04_collections | 数组、切片(slice)、map | Array / ArrayList / HashMap |
| 05 | 05_strings_runes | string / byte / rune / UTF-8 | String / char / Character,但语义不同 |
| 06 | 06_pointers | 指针 *T / &v |
Java 引用 + 显式取地址 |
| 07 | 07_struct_methods | struct、方法、值接收者 vs 指针接收者 | POJO + 方法,没有继承 |
| 08 | 08_interfaces | 接口隐式实现、类型断言、类型 switch、空接口 any |
鸭子类型版的 interface,无 implements |
| 09 | 09_errors | error 接口、errors.Is/As、panic/recover |
异常的替代方案,error 是值不是控制流 |
| 10 | 10_concurrency | goroutine、channel、select、sync.WaitGroup/Mutex |
替代 Thread / ExecutorService / BlockingQueue |
| 11 | 11_generics | 类型参数(Go 1.18+) | Java 泛型,但 Go 是单态化(monomorphization) |
| 12 | 12_packages_and_modules.md | 包、模块、go mod、可见性 |
包名约定 + Maven/Gradle |
| 工程实战 | |||
| 13 | 13_testing | testing 包、表驱动、子测试、benchmark、Example、手写 mock |
JUnit + Mockito + JMH |
| 14 | 14_context | context.Context、Cancel/Timeout/Deadline/Value、传播链 |
ThreadLocal + Future.cancel + Interrupt |
| 15 | 15_http_server | net/http、Handler/Mux、中间件、JSON、graceful shutdown |
Spring Boot Web |
| 16 | 16_http_client | http.Client、超时、JSON、Transport、重试 |
RestTemplate / OkHttp |
| 17 | 17_database_sql | database/sql、参数化、事务、连接池、Rows.Scan |
JDBC + HikariCP |
| 18 | 18_logging_slog | log/slog 结构化日志、Handler、With、LogValuer、ctx 透传 |
SLF4J + Logback + MDC |
| 综合项目 | |||
| 99-D | 99_full_demo | 订单微服务:cmd/internal 分层 + 中间件 + DB + 日志 + 单测/集成测试 | Spring Boot 项目骨架 |
| 99 | 99_java_vs_go_cheatsheet.md | Java ↔ Go 对照速查表 | — |
- 没有类、没有继承:只有
struct+ 方法 + 接口。复用靠 组合(嵌入字段)+ 接口。 - 接口是隐式实现的:没有
implements关键字。一个类型实现了接口里所有方法 = 它就是该接口。 - error 是返回值,不是异常:
if err != nil { return err }这行你会写一辈子。panic只用于不可恢复的程序 bug。 - 零值可用:
var s string是"",var m map[string]int是nil但可读不可写,var slice []int是nil但可以 append。Go 设计时会让"零值就是合理初始状态"。 - 值类型 vs 引用类型:
struct默认是值类型,赋值/传参是 拷贝。要共享必须传指针*T。slice/map/channel 是引用语义(内部含指针)。 - 大小写决定可见性:标识符首字母大写 = 包外可见(相当于
public),小写 = 包内私有(相当于package-private)。没有private/public/protected关键字。 - goroutine 几乎免费:起 10 万个 goroutine 是常规操作,对应 Java 起 10 万个 Thread 会 OOM。
- channel 是一等公民:用 channel 通信代替锁。Go 哲学:"Don't communicate by sharing memory; share memory by communicating."
- defer 像 try-with-resources:但更灵活——任何函数末尾要做的清理都用 defer,按后进先出顺序执行。
- 没有三元运算符、没有 while、没有 do-while:全部用
if/else和for表达。Go 故意保持语言极简。
Part 1 — 语法(约 1 周)
- 第 1 天:跑通 01–03,重点理解多返回值和 defer。
- 第 2 天:04–06,切片底层结构 + 指针,是大坑高发区。
- 第 3 天:07–08,struct/接口/组合,转换思维方式。
- 第 4 天:09,错误处理范式(这是 Java 开发者最别扭的地方)。
- 第 5 天:10,并发,这是 Go 的核心竞争力。
- 第 6 天:11–12,泛型 + 模块管理。
Part 2 — 工程实战(约 1 周)
- 第 7 天:13 测试 + 14 context(这两个必看,所有后续章节都依赖)。
- 第 8 天:15 HTTP 服务端 + 16 客户端。把 15 跑起来后用 16 的客户端调它,串起来。
- 第 9 天:17 database/sql 真正动手做增删改查 + 事务。
- 第 10 天:18 slog 改造日志输出,加 trace id 透传。
- 第 11+ 天:综合项目——写一个真实小服务:HTTP + SQLite/Postgres + 结构化日志 + 单测 + ctx 贯穿。
| 章节 | 运行命令 |
|---|---|
| 01–12(除 12 是 md) | go run ./0X_xxx |
| 13_testing | go test -v ./13_testing |
| 14_context | go run ./14_context |
| 15_http_server | go run ./15_http_server,另开终端 curl http://localhost:8080/health |
| 16_http_client | go run ./16_http_client(内置 fake server,离线可跑) |
| 17_database_sql | go run ./17_database_sql(内嵌 SQLite,无需外部 DB) |
| 18_logging_slog | go run ./18_logging_slog |
- 官方 Tour:https://go.dev/tour/
- 官方 Effective Go:https://go.dev/doc/effective_go
- 官方 Standard Library:https://pkg.go.dev/std
- 书:《Go 程序设计语言》(The Go Programming Language by Donovan & Kernighan)