Go 后端学习笔记
面向 Java / Python 后端工程师的 Go 语言与 Web 后端开发系列,从语法到并发、框架再到工程落地。
一、系列定位
1.1 这套笔记写给谁
已有 Java 或 Python 后端基础、希望掌握 Go 并投入 Web 服务开发的工程师。笔记默认你会一门后端语言,因此大量使用与 Java / Python 的对照讲解,而不重复解释"什么是循环、什么是数据库"这类通用概念。
1.2 内容覆盖总览
| 模块 | 文件 | 一句话简介 | 难度 |
|---|---|---|---|
| Go 基础 | Go-基础.md | 环境与 go mod、语法要素、函数、切片 Map、字符串、结构体 | ⭐ |
| Go 进阶特性 | Go-进阶特性.md | 指针、接口、错误处理、反射、泛型、测试与标准库 | ⭐⭐ |
| Go 并发编程 | Go-并发编程.md | goroutine、channel、sync、GMP 调度、并发模式 | ⭐⭐⭐ |
| Go Gin 框架 | Go-Gin框架.md | 路由、参数校验、中间件、JWT、优雅关停、pprof | ⭐⭐ |
| Go Web 项目实践 | Go-Web项目实践.md | 分层工程、GORM、Redis 缓存、zap、Docker、生产坑 | ⭐⭐⭐ |
1.3 推荐学习路径
| 阶段 | 学习内容 | 产出 |
|---|---|---|
| 第一阶段:语法入门 | Go-基础 | 用 Go 重写一个之前用 Java/Python 写过的小工具 |
| 第二阶段:语言进阶 | Go-进阶特性 | 给工具补上错误处理与单元测试 |
| 第三阶段:并发 | Go-并发编程 | 手写 worker pool,跑通 go test -race |
| 第四阶段:Web 框架 | Go-Gin框架 | 完成带 JWT 鉴权的 REST API |
| 第五阶段:工程实践 | Go-Web项目实践 | 按分层范式搭一个可 Docker 部署的完整服务 |
建议顺序阅读:Go-基础 → Go-进阶特性 → Go-并发编程 → Go-Gin框架 → Go-Web项目实践。前两篇可并行,但并发与框架章节依赖前文概念。
二、Java / Python 转 Go:语法速览
2.1 变量与常量
| 场景 | Go | Java | Python |
|---|---|---|---|
| 声明变量 | var x int = 1 / x := 1 | int x = 1; | x = 1 |
| 多返回值 | func f() (int, error) | 需封装对象或 Optional | 元组解包 |
| 常量 | const Max = 100 | static final | 惯例全大写 |
| 枚举 | iota + 类型别名 | enum | IntEnum |
| 类型转换 | 显式 int64(x) | 显式强转 | 隐式随意 |
2.2 流程控制
| 场景 | Go | Java | Python |
|---|---|---|---|
| 循环 | 只有 for | for / while / do-while | for / while |
| switch 穿透 | 默认不穿透,fallthrough 显式穿透 | 默认穿透,break 显式跳出 | match-case(3.10+) |
| 条件带初始化 | if err := f(); err != nil | 无(可变量提升) | 无 |
| 遍历 | for i, v := range xs | 增强 for | enumerate |
2.3 对象模型
| 场景 | Go | Java | Python |
|---|---|---|---|
| 类型定义 | type User struct{...} | class User | class User |
| 方法 | 结构体外 func (u *User) M() | 类内方法 | 类内方法 |
| 继承 | 无,结构体内嵌组合 | extends | 多继承 |
| 可见性 | 首字母大小写 | public / private / protected | 下划线约定 |
| 构造 | 工厂函数 NewUser() | 构造器 | __init__ |
| 接口 | 隐式实现(鸭子类型) | implements 显式 | ABC / Protocol |
| 泛型 | Go 1.18+ 基础泛型 | 成熟泛型体系 | typing(弱) |
2.4 错误与异常
| 场景 | Go | Java | Python |
|---|---|---|---|
| 表达方式 | 返回值 error | 异常抛出 | 异常抛出 |
| 处理 | if err != nil | try/catch | try/except |
| 包装 | fmt.Errorf("...: %w", err) | cause 链 | raise ... from |
| 判断类型 | errors.Is / errors.As | instanceof / 多 catch | except XxxError |
| 致命错误 | panic + recover | 未捕获异常 | 未捕获异常 |
2.5 并发
| 场景 | Go | Java | Python |
|---|---|---|---|
| 轻量任务 | go func(){...}() | 线程 / 虚拟线程(Loom) / 线程池 | 协程 asyncio / 线程 |
| 消息传递 | channel | BlockingQueue | Queue |
| 等待完成 | sync.WaitGroup | CountDownLatch / Future.get | asyncio.gather |
| 锁 | sync.Mutex / RWMutex | synchronized / ReentrantLock | threading.Lock |
| 取消传播 | context | 中断 / Future.cancel | task.cancel |
| 原子操作 | atomic | AtomicInteger / volatile | 无(GIL) |
2.6 工程生态对照
| 场景 | Go | Java | Python |
|---|---|---|---|
| 依赖管理 | go mod | Maven / Gradle | pip / poetry |
| 主流 Web 框架 | Gin / Echo / Fiber | Spring Boot | Django / FastAPI |
| ORM | GORM / sqlx | MyBatis / JPA | SQLAlchemy |
| 测试 | testing + go test | JUnit | pytest |
| 构建产物 | 单二进制 | jar / war | 源码包 |
| 部署 | Docker 直接跑 | JDK + jar | 解释器 + 依赖 |
2.7 思想转变要点
| Java / Python 习惯 | Go 的正确姿势 |
|---|---|
| 用异常控制业务错误 | 错误是返回值,每个边界显式处理 |
| 面向对象建模(继承体系) | 结构体组合 + 小接口,为行为而非抽象编码 |
| 线程池 + Future 编排任务 | goroutine + channel / WaitGroup,任务即协程 |
| 重度 ORM 模板与反射框架 | 接受"薄框架",手写胶水代码换透明可控 |
| 虚拟机调优(GC、堆) | 关注 goroutine 数与内存分配(pprof) |
三、版本与运行说明
3.1 推荐版本
笔记示例基于 Go 1.22+(涉及 range 遍历整数、循环变量新语义、slices/maps 泛型包等 1.21/1.22 新特性),建议新项目直接使用当前最新稳定版。
3.2 验证环境
bash
go version # 确认已安装
go env GOPROXY # 国内建议 https://goproxy.cn,directgo version # 确认已安装
go env GOPROXY # 国内建议 https://goproxy.cn,direct3.3 代码约定
- 正文代码均为"可运行风格"片段:标注
package main的可在空模块直接go run;标注func的为节选,需按上下文补全 import 与调用。 - 涉及第三方库(gin、gorm、go-redis、zap 等)的版本以
go get时的最新稳定版为准。
Cao Note