Skip to content

wanghongqiang1027/go-for-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Go for Java Developers — 从 Java 视角学 Go

面向有 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/Aspanic/recover 异常的替代方案,error 是值不是控制流
10 10_concurrency goroutine、channel、selectsync.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、WithLogValuer、ctx 透传 SLF4J + Logback + MDC
综合项目
99-D 99_full_demo 订单微服务:cmd/internal 分层 + 中间件 + DB + 日志 + 单测/集成测试 Spring Boot 项目骨架
99 99_java_vs_go_cheatsheet.md Java ↔ Go 对照速查表

心智模型差异(先记住这 10 条,少走弯路)

  1. 没有类、没有继承:只有 struct + 方法 + 接口。复用靠 组合(嵌入字段)+ 接口
  2. 接口是隐式实现的:没有 implements 关键字。一个类型实现了接口里所有方法 = 它就是该接口。
  3. error 是返回值,不是异常if err != nil { return err } 这行你会写一辈子。panic 只用于不可恢复的程序 bug。
  4. 零值可用var s string""var m map[string]intnil 但可读不可写,var slice []intnil 但可以 append。Go 设计时会让"零值就是合理初始状态"。
  5. 值类型 vs 引用类型struct 默认是值类型,赋值/传参是 拷贝。要共享必须传指针 *T。slice/map/channel 是引用语义(内部含指针)。
  6. 大小写决定可见性:标识符首字母大写 = 包外可见(相当于 public),小写 = 包内私有(相当于 package-private)。没有 private/public/protected 关键字
  7. goroutine 几乎免费:起 10 万个 goroutine 是常规操作,对应 Java 起 10 万个 Thread 会 OOM。
  8. channel 是一等公民:用 channel 通信代替锁。Go 哲学:"Don't communicate by sharing memory; share memory by communicating."
  9. defer 像 try-with-resources:但更灵活——任何函数末尾要做的清理都用 defer,按后进先出顺序执行。
  10. 没有三元运算符、没有 while、没有 do-while:全部用 if/elsefor 表达。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

推荐配套资料

About

A Go tutorial for Java developers, organized by topic with Java-to-Go comparisons.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages