🐹 Go 语言学习路线图

从零基础到生产级 Go 开发者 · 预计 3-4 个月(每天 2 小时)
⚙️ 1. 环境安装与第一个程序 半天

学什么下载安装 Go,配置 GOPATH / GOROOT,VS Code + Go 插件

推荐教程Go 官方安装指南B站环境搭建视频

练习写 Hello World + 加减乘除计算器

过关标准能运行 go versiongo run,配置好 VS Code 自动补全

📖 2. 基础语法 1-2 周

学什么变量、常量、数据类型、流程控制、函数(多返回值、defer)、结构体、方法

推荐教程《Go 程序设计语言》Go by ExampleTour of Go

练习斐波那契数列 · 学生成绩管理系统 · 命令行待办事项工具

过关标准能独立写带结构体、方法、slice 操作的程序,理解值/引用类型区别

📚 3. 标准库 1-2 周

学什么fmt、strings、strconv、time、os、io、bufio、json、net/http、flag 等核心包

推荐教程Go 标准库中文文档官方文档 + 翻源码

练习flag 命令行工具 · json 读写配置文件 · net/http 静态文件服务器

过关标准能熟练查阅标准库文档,遇到问题知道去哪个包找答案

4. 并发编程 2-3 周

学什么goroutine、channel、select、sync 包(WaitGroup/Mutex/RWMutex/Once)、Context、并发模式

推荐教程《Go 语言并发之道》B站并发编程视频

练习并发下载文件 · 生产者-消费者 · 并发爬虫(控制并发数)

过关标准能解释 goroutine 和线程的区别,能写出无 data race 的并发程序,会用 -race 检测

🌐 5. Web 开发 2-3 周

学什么net/http 深入、Gin 框架、RESTful API、中间件、模板渲染

推荐教程Gin 官方文档《Go Web 编程》

练习博客后端(注册登录、文章 CRUD)· JWT 鉴权中间件 · 短链接服务

过关标准能独立搭建带鉴权、中间件、RESTful API 的 Web 服务

🗄️ 6. 数据库 2 周

学什么MySQL/PostgreSQL 基础、database/sql、GORM、Redis 基础

推荐教程GORM 官方文档Redis 入门指南

练习博客数据迁移到 MySQL · GORM 关联查询 · Redis 缓存加速

过关标准能写 CRUD、会使用事务、能解释并解决 N+1 查询问题

🔌 7. 微服务 3-4 周

学什么微服务架构、gRPC、服务注册发现(Consul/etcd)、API 网关、消息队列、Docker

推荐教程gRPC 官方文档《微服务架构设计模式》

练习拆分博客为多服务(用户/文章/评论)· gRPC 通信 · Docker Compose 编排

过关标准能设计微服务架构,能写 proto 文件并生成代码,理解服务间通信方式

🚀 8. 部署与运维 1-2 周

学什么Docker 镜像构建、Docker Compose、CI/CD(GitHub Actions)、Nginx 反向代理、日志收集

推荐教程Docker 从入门到实践GitHub Actions 文档

练习项目 Docker 化 · 编写 Dockerfile + docker-compose.yml · 配置 GitHub Actions 自动部署

过关标准能独立将项目打包成 Docker 镜像并部署运行,能配置简单的 CI/CD 流水线

🚀 3 个递进实战项目

命令行任务管理器

语法 + 标准库阶段

文件读写JSON 序列化flag 命令行参数结构体设计
⭐⭐

短链接服务

Web + 数据库阶段

Gin 框架MySQL 存储Redis 缓存RESTful APIDocker 部署
⭐⭐⭐

分布式文件存储系统

并发 + 微服务阶段

gRPC 通信分片存储并发上传下载服务注册发现Docker Compose

⚠️ 常见坑(新手必看)

1. GOPATH 陷阱

Go 1.16 之后推荐用 Go Modules,不要再把项目放 $GOPATH/src 下了,用 go mod init 初始化项目。

2. 循环变量引用

在 goroutine 中直接使用 for 循环变量,会导致所有 goroutine 共享最后一个值。

// ❌ 错误写法 for _, v := range items { go func() { fmt.Println(v) }() } // ✅ 正确写法 for _, v := range items { v := v go func() { fmt.Println(v) }() }
3. defer 在循环中

defer 在函数返回时才执行,如果在循环里用 defer 关闭资源,会等到整个函数结束才关闭,容易导致资源耗尽。建议在循环内用匿名函数包裹。

4. nil 切片 vs 空切片

var s []intnils := []int{} 是空切片,JSON 序列化时行为不同(nil 输出 null,空切片输出 [])。

5. 接口的 nil 陷阱

一个接口变量在底层类型和值都为 nil 时才为 nil,如果接口变量持有 (*T)(nil),则接口本身不是 nil

6. 忘记调用 rows.Close()

数据库查询后一定要 defer rows.Close(),否则连接池会被耗尽。

7. 并发写 map

Go 的 map 不是并发安全的,并发读写会 panic。必须sync.Mutexsync.Map