🐹 Go 学习路线
142 个互动教程
Go 语言入门 — 简洁高效的编译型语言
了解 Go:Google 开发的现代语言,云原生时代的首选
Go 结构体 — 自定义数据类型
用 struct 定义数据结构,面向数据编程
Go 切片 Slice
Slice 创建、append、截取、容量、make
Go defer 延迟执行
defer 确保资源清理,LIFO 顺序,参数求值时机
Go Map 详解
Map 创建、增删改查、遍历、nil map 陷阱
Go JSON 序列化
encoding/json:Marshal/Unmarshal、struct tag、omitempty
Go 时间处理 — time 包
时间格式化、计算时间差、定时器、时区处理
Go 字符串操作 — strings 包
strings 包常用函数:查找、替换、分割、拼接
Go 协程 — 并发编程
goroutine:轻量级线程,go 关键字一行代码启动并发
Go语言 — Go 接口
学习Go语言中Go 接口 — Go教程的详细用法和最佳实践
Go 错误处理
error 接口、errors.New、自定义错误、panic/recover
Go Channel — goroutine 间通信
用 channel 在 goroutine 间安全传递数据
Go Select — 多路复用选择
用 select 同时监听多个 channel,超时控制
Go 指针详解
&取地址、*解引用、值传递 vs 指针传递、new 函数
Go Embed 嵌入文件
//go:embed 编译时打包静态资源到二进制
Go sync.Mutex 互斥锁
Mutex 保护共享资源、Lock/Unlock、RWMutex
Go Context 上下文
超时控制、取消信号、传递请求范围数据
Go 切片进阶
append 删除、copy、多维切片、nil vs empty
Go 错误包装
fmt.Errorf + %w 包装错误、errors.Is/As 判断链
Go 包管理与模块
go mod init/tidy/get、导入路径、版本管理
Go 接口进阶
类型断言、类型 switch、空接口 any
Go goroutine并发
学习goroutine
Go 函数进阶
多返回值、命名返回值、可变参数、函数类型、闭包
Go HTTP 服务器
net/http 标准库构建 REST API
Go 测试与基准
go test/表驱动测试/benchmark/覆盖率
Go Workspaces 工作区
Go 1.18+ Workspaces:go.work文件、同时开发多个模块、go work use添加模块、替代replace指令、monorepo场景
Go Fuzzing 模糊测试
Go 1.18+ Fuzzing:FuzzXxx(f*testing.F)模糊测试函数、f.Add添加种子语料、f.Fuzz执行模糊测试、crash复现、与单元测试对比
Go Fiber Web框架
Fiber框架(Express风格/基于Fasthttp):路由/中间件/分组、JSON解析/响应、静态文件服务、模板引擎(HTML/Pug/Mustache)、比Gin更接近Express
Go gRPC 通信
gRPC(Google RPC):Protobuf定义服务(.proto)、protoc生成Go代码、Unary/Server Streaming/Client Streaming/Bidirectional四种模式、gRPC-gateway转REST
Go Goroutine 并发模式
Go并发模式:Fan-Out/Fan-In扇出扇入、Pipeline管道模式(channel串联)、Or-Done模式、Tee多路复用、Rate Limiting限流(time.Tick)、Worker Pool工作池模式
Go 数据库迁移 golang-migrate
golang-migrate数据库迁移:up/down迁移文件、版本管理、migrate CLI工具、在Docker/K8s中集成(initContainer/Job)、与GORM AutoMigrate对比
Go 接口设计原则
Go接口设计最佳实践:Accept Interfaces Return Structs原则、小接口单一职责(io.Reader/io.Writer模式)、接口污染Interface Pollution(不要为未来抽象)、接口隔离与组合
Go 错误包装与处理
Go 1.13+错误处理:fmt.Errorf %w包装错误、errors.Is/errors.As判断/提取错误类型、errors.Unwrap解包错误链、自定义错误类型(实现Error()和Unwrap())、pkg/errors增强
Go Context 深入
Go Context深入:context.Background()/TODO()、WithCancel/WithDeadline/WithTimeout/WithValue、context传播链取消信号(父cancel→全部子cancel)、context.Value最佳实践(不存大对象/不存可选参数)
Go sync 原语深入
Go sync包深入:sync.Once(单次初始化/单例)、sync.Pool(临时对象池减少GC)、sync.Cond(条件变量广播/信号)、sync.Map(并发安全的map/适合读多写少)、errgroup.Group并行错误处理
Go CGO 实战
CGO实战:// #cgo CFLAGS/LDFLAGS编译链接配置、C类型和Go类型转换(C.int/C.char*)、C.malloc/C.free手动内存管理、将Go函数暴露给C(//export)、交叉编译CGO_ENABLED=1限制
Go Build Constraints 条件编译
Go条件编译://go:build标签(Go 1.17+替代// +build)、平台标签(linux/darwin/windows/amd64/arm64)、cgo标签、自定义标签(-tags)、文件名后缀_GOOS_GOARCH.go自动选择
Go go-cmp 深度比较库
go-cmp/cmp包(比reflect.DeepEqual更强大/推荐):cmp.Equal比较、cmp.Diff差异输出(类git diff格式)、自定义比较器cmpopts、忽略未导出字段cmpopts.IgnoreUnexported、排序切片比较cmpopts.SortSlices
Go Struct Tags 深入
Go结构体标签深入:json/xml/gorm/validate/yaml/protobuf等标签、reflect.StructTag.Get/Lookup解析标签、标签的格式key1:'value1'key2:'value2'、自定义标签应用(字段验证/数据库映射/文档生成)
Go Plugin 插件系统
Go plugin包动态加载.so共享库(plugin.Open打开/plugin.Lookup查找符号/热加载):局限性(Linux only/Go版本必须完全一致编译工具链/CGO问题)、替代方案hashicorp/go-plugin(子进程RPC通信/跨语言/热升级)
Go pprof 性能分析
Go pprof性能分析实战:runtime/pprof导入/net/http/pprof自动注册端点、CPU profiling采集/Heap内存分析/Goroutine分析、go tool pprof交互命令(top/list/web/flame)、火焰图生成、benchmark -benchmem基准测试内存分配
Go generate 代码生成
go generate代码生成工具://go:generate指令注释、stringer生成String()方法(为枚举类型)、mockgen生成mock、protoc+protoc-gen-go生成Protobuf/gRPC代码、wire依赖注入代码生成
Go AST 抽象语法树
Go go/ast包操作源码:go/parser.ParseFile解析Go源码为AST、go/ast.Inspect遍历AST节点(ast.Ident/ast.FuncDecl/ast.GenDecl/ast.CallExpr)、go/format.Node格式化输出源码、AST应用(linter自定义规则/code generator代码生成器改写源码/import自动管理)
Go embed 深入
Go embed深入:嵌入整个目录embed.FS文件系统(包含子目录/只读)、http.FileServer(http.FS())服务静态文件/前端资源嵌入二进制单文件部署、path匹配模式/*和嵌套、嵌入文件压缩(编译时存储效率)
Go log/slog 结构化日志
Go 1.21+ log/slog结构化日志:slog.Info('msg','key',value)键值对日志、slog.JSONHandler/slog.TextHandler输出格式、With/WithGroup分组添加公共属性、LogAttrs提升性能、slog.Level(slog.LevelDebug/Info/Warn/Error)日志级别、与zap/zerolog/logrus对比
Go 重试模式
Go重试模式:简单for循环重试、指数退避Exponential Backoff+随机抖动Jitter、重试条件(按错误类型/状态码/上下文取消ctx.Done())、最大重试次数和总超时、幂等性保证
Go 函数式编程实践
Go中函数式编程风格:闭包Closure捕获变量、一等公民函数(func作为参数/返回值/高阶函数map/filter/reduce手动实现)、函数选项模式Functional Options(可选配置/优雅构造/比Builder简单)、与Java Stream/Rust Iterator对比
Go Map 性能与陷阱
Go map深入:map的底层实现(哈希表hmap/bucket链表)、nil map可读但不可写→panic:assignment to entry in nil map、map并发读写fatal error:concurrent map read and write(map不是并发安全的需sync.RWMutex/sync.Map)、map遍历顺序随机(有意设计防依赖遍历顺序/add maph
Go embed 前端部署实战
Go embed单文件Web部署://go:embed static/*嵌入前端构建产物到Go二进制、http.FileServer+embed.FS服务静态资源、Go+SPA前端单文件部署、SPA路由fallback到index.html
Go 入门 — 环境搭建与第一个程序
Go语言简介、安装Go SDK、GOPATH/GOROOT配置、go mod init初始化模块、第一个Hello World、go run/go build编译运行
Go 变量与类型系统
Go变量声明:var关键字、:=短声明、零值概念、基本类型(int/float/string/bool)、类型转换(必须显式)、常量const、iota枚举
Go interface 接口
Go接口:隐式实现(无需声明)、空接口interface{}(类似any)、类型断言.(Type)、类型switch、Stringer/error等标准接口、接口组合
Go sync包:并发安全与同步原语
深入理解Go sync包中的Mutex、WaitGroup、Once、Cond等同步工具,掌握并发编程的核心技巧。
Go泛型:类型安全与代码复用
学习Go 1.18引入的泛型特性,包括类型参数、约束和泛型函数/类型的使用方法。
Go 包管理与模块
Go Modules深入:go.mod/go.sum文件、依赖版本管理(语义导入版本)、replace本地替换、vendor目录、go get/install、模块代理GOPROXY
Go io包:输入输出接口与流式处理
掌握io.Reader和io.Writer接口,学习如何高效处理数据流,包括组合、缓冲和自定义实现。
Go 错误处理最佳实践
Go错误处理:error接口、errors.New/fmt.Errorf创建错误、%w包装错误(errors.Is/As)、自定义错误类型、defer+recover处理panic
Go bufio:带缓冲的I/O操作
学习bufio包如何通过缓冲减少系统调用,提高文件、网络等I/O操作的性能。
Go reflect:运行时反射与元编程
探索reflect包,学习如何在运行时检查类型、调用方法和修改结构体字段。
Go unsafe:内存操作与类型转换
了解unsafe包的危险与强大,学习指针运算、类型转换和内存布局操作。
Go Web框架 Gin 入门
Gin框架(高性能HTTP Web框架):gin.Default()创建、GET/POST路由、路径参数/Query参数、ShouldBindJSON绑定、中间件Middleware、Gin + GORM组合
Go cgo:调用C语言库
学习使用cgo在Go中调用C代码,包括类型转换、内存管理和构建标签。
Go build标签:条件编译与平台适配
掌握Go的构建标签(build tags),实现条件编译、平台特定代码和功能开关。
Go race检测:数据竞争排查
学习使用Go内置的竞态检测器(race detector)识别和修复并发程序中的数据竞争问题。
Go pprof:性能分析与优化
学习使用pprof工具对Go程序进行CPU、内存、goroutine等性能分析,找出瓶颈。
Go sync包:并发同步模式
学习使用sync包中的Mutex、WaitGroup、Once和Cond进行并发控制与同步。
Go泛型:类型参数与约束
掌握Go 1.18引入的泛型,编写可复用的类型安全函数和数据结构。
Go io包:流式数据读写
深入理解io.Reader和io.Writer接口,掌握流式处理数据的方法。
Go bufio:带缓冲的I/O操作
学习使用bufio包进行高效的行读取、扫描和格式化输入输出。
Go reflect:运行时反射与自省
探索reflect包,实现在运行时检查类型、调用方法和修改结构体字段。
Go sync包:并发同步原语
掌握Go语言sync包中的Mutex、WaitGroup、Once和Cond,实现安全的并发编程。
Go io包:读写流与接口设计
深入理解Go io包中的Reader、Writer等核心接口,掌握数据流处理模式
Go reflect包:运行时反射与元编程
掌握Go reflect包,在运行时检查类型、调用方法和修改值
Go泛型:类型参数与约束
理解Go 1.18引入的泛型语法,编写可复用的类型安全函数与数据结构。
Go reflect:运行时反射与元编程
掌握reflect包的核心概念Type和Value,学习如何动态检查类型、调用方法和修改字段。
Go io包:Reader与Writer接口
掌握io.Reader和io.Writer接口的设计哲学,实现数据流的读写与组合。
Go bufio:带缓冲的输入输出
学会使用bufio包提高I/O效率,处理带缓冲的读写、行读取和扫描。
Go bufio包:带缓冲的I/O操作
学习使用bufio包提高I/O性能,包括带缓冲的读写、Scanner和行读取。
Go reflect包:运行时反射机制
学习使用reflect包在运行时检查类型、获取字段标签、动态调用方法和修改值。
Go sync包:并发安全与同步原语
学习使用sync包中的Mutex、WaitGroup、Once等原语实现并发安全与协程同步。
Go bufio:带缓冲的I/O操作
学习使用bufio包减少系统调用、提高读写效率,包括Scanner、Reader和Writer。
Go reflect:运行时反射与元编程
探索reflect包,学习如何在运行时检查类型、读写值、调用方法以及处理结构体标签。
逃逸分析与栈上分配:Go 的内存布局决策机制
深入理解 Go 编译器如何决定变量是分配到堆还是栈上,以及如何通过逃逸分析优化性能。
利用 select + fallthrough 实现非阻塞多路复用
探索 select 语句中 fallthrough 的隐藏用法,构建超时和默认路径组合的非阻塞通道操作。
类型断言中的错误处理新范式:空接口与接口组合
超越简单的 ok 模式,学习如何在类型断言中结合自定义错误类型和接口组合来优雅处理类型转换失败。
internal 包与测试黑盒:如何安全暴露内部 API 给测试
利用 Go 的 internal 包机制和导出规则,为测试代码提供特权访问而不破坏封装。
运行时死锁检测:利用 trace 和 pprof 可视化goroutine等待图
通过 Go 的 runtime/trace 和 net/http/pprof 组合,实时检测并分析死锁发生的 goroutine 链。
泛型函数柯里化:利用类型参数实现高阶函数组合
使用 Go 1.18+ 的泛型特性,实现可复用的柯里化(currying)模式,将多参数函数转化为链式调用。
unsafe.Pointer 与内存对齐:绕过类型系统实现零拷贝操作
深入 unsafe 包和内存对齐规则,学习如何安全地操作底层内存布局,实现高效的结构体序列化和字段访问。
无 CGO 调用 C 库:利用 os/exec 和 syscall 模拟外部接口
在不引入 CGO 的前提下,通过系统调用和子进程通信调用 C 动态库,保持纯 Go 构建的便利性。
接口值的内部表示与相等性比较优化:避免反射陷阱
剖析 interface{} 的底层结构(typetab 和 data),以及如何高效比较包含复杂类型的接口值。
调度器工作窃取与 NUMA 感知:优化多核 CPU 上的 goroutine 分布
探索 Go 调度器的 work-stealing 算法,以及如何通过 GOMAXPROCS 和亲和性设置适应非均匀内存访问架构。
深入 Wire:基于反射的依赖注入容器定制
本教程讲解 Google Wire 在编译期注入之外的另一种路径:通过反射机制实现运行时依赖注入。将覆盖 reflect 包构建注入器、处理接口绑定、生命周期管理。
Go 原生插件热替换:利用 plugin 包实现安全热更新
本教程探索 Go 1.8 引入的 plugin 包构建共享对象热替换系统,重点解决符号冲突、版本兼容、优雅关闭问题。不同于常见的 RPC/HTTP 热更新方案,让你直接操作内存级插件。
eBPF + Go:零侵入网络流量追踪与协议解析
使用 ebpf-go 库编写小工具,挂载 tracepoint/syscalls 追踪所有 TCP connect 调用,结合 Go 用户态解析 IP 与端口,无需 netstat 或 tcpdump。
逃脱 GC 的眼:用 runtime.SetFinalizer 构建内存泄漏侦探
深入 finalizer 机制,编写一个自动侦测未关闭资源(文件/连接)的调试工具,利用 weak reference 模式避免正常回收误报。
CGo 回调编组:在 C 线程安全调用 Go 函数并避免死锁
探讨 C 库回调 Go 时的编组策略,解决 runtime.LockOSThread、信号阻塞、栈扩容等问题,构建一个通用的 C->Go marshaller。
差分模糊测试:用 Go fuzz 发现加密库实现差异
使用 go-fuzz 对自定义 AES 实现与标准库进行差分测试,发现难以察觉的边界错误,覆盖分组模式、填充方式、密钥扩展。
缓存无关算法:重排二维数组遍历以榨干 CPU 缓存行
通过 Go 测试框架验证行优先/列优先访问的性能差异,并实现递归分块遍历(cache oblivious),对比 SIMD 等效优化。
Slice 头解剖:用 unsafe 实现零拷贝类型转换与版本控制
直接操作 reflect.SliceHeader 在 []byte 与自定义结构间转换,避免 copy。深入讨论对齐、字节序、GC 指针追踪陷阱,构建一个安全的高性能序列化层。
泛型模拟结构类型:构建一个编译期类型安全的事件总线
利用 Go 1.18 泛型约束与嵌入 interface 模拟结构类型(structural typing),实现一个可匹配任意结构体字段的事件分发系统,无需反射。
Go 调度器解剖:手工调整 GOMAXPROCS 与 P 的绑定策略
通过 runtime.Gosched、LockOSThread、以及 proc 绑定实验,手动干预 M 与 P 的关联,实现延迟敏感的 CPU 隔离。
结构体字段重排:零成本内存优化术
通过调整结构体字段顺序,利用CPU缓存行对齐特性,减少内存填充,提升访问速度。
nil channel 的妙用:构建可关闭的 goroutine 安全池
利用nil channel永久阻塞的特性,动态启用/禁用goroutine中的通信路径,实现优雅关闭与降级。
手动逃逸分析:让对象留在栈上的终极技巧
通过编译器逃逸分析原理,使用指针接收者、返回值优化和sync.Pool巧妙控制内存分配位置。
接口为nil但类型不为nil:Go中隐藏的nil陷阱
剖析接口内部实现(tab+data),揭示为什么nil指针赋值给接口后,接口!=nil。
Context取消链:构建可传播的层级取消信号
通过WithCancel、WithTimeout和WithDeadline组合使用,创建多层级取消传播机制。
Finalizer与循环引用:手动触发GC的隐秘副作用
利用runtime.SetFinalizer和runtime.GC的组合,处理循环引用资源清理。
unsafe.Pointer类型双关:安全打破类型系统的艺术
通过unsafe.Pointer在不同类型间转换数据,实现零拷贝数据解析。
类型约束设计模式:构建可组合的泛型数学库
利用泛型约束的嵌入和接口组合,实现类似Haskell的类型类。
数据竞争检测器内部原理:如何精准定位并发bug
深入Go race detector的实现(ThreadSanitizer),理解happens-before关系。
GMP调度器之手递手机制:最大化CPU利用率的秘密
剖析Go调度器中的hand off机制,当goroutine阻塞时M如何快速切换P。
逃逸分析:Go编译器如何决定堆栈分配
深入探讨Go编译器的逃逸分析机制,理解变量的堆栈分配决策过程。
内存序与原子操作:Go的同步原语底层原理
解析Go内存模型,深入sync/atomic包中的内存屏障和顺序一致性。
接口值的内部表示:动态派发与类型断言优化
深入Go接口的底层实现,理解接口值的二进制布局和性能优化。
defer与recover的隐藏陷阱:闭包、参数求值时机
揭示defer在闭包捕获、参数求值和panic恢复中的微妙行为。
Go调度器中的工作窃取:GPM模型与P本地队列
深入Go运行时调度器,分析工作窃取算法和P本地队列的负载均衡。
哈希碰撞与扩容策略:Go map的底层实现剖析
深入Go map的哈希表实现,分析链地址法、负载因子和渐进式扩容。
反射的开销根源:动态类型系统的性能成本与控制
分析Go反射的性能瓶颈:内存分配、方法查找与动态调用优化。
泛型类型约束:Go类型集的演进与性能权衡
深入Go1.18泛型的类型约束系统,分析接口作为类型集的编译时特化。
数据竞争检测器:happens-before关系的运行时可视化
深入Go race detector原理:ThreadSanitizer如何推断happens-before关系。
unsafe包与内存布局:结构体对齐与字段偏移量计算
深入unsafe.Pointer,分析Go结构体的内存布局、对齐规则和字段偏移。
用Go实现一个轻量级IO调度器:从零设计任务窃取引擎
Goroutine调度器来自运行时,但我们能自己实现一个针对io密集型任务的调度器吗?本教程将带你设计一个带有任务窃取(work-stealing)机制的、仅使用channel与select的调度内核。
基于反射的运行时性能分析器:无需pprof也能抓取热点
本教程教你利用reflect包在运行时动态追踪函数调用频率与耗时,生成简易火焰图数据。
unsafe.Pointer的边界艺术:零拷贝转换与内存对齐黑科技
安全地使用unsafe包实现字节切片到字符串的零拷贝、结构体到字节流的快捷转换,以及避开内存对齐陷阱。
Go编写的eBPF小工具:追踪进程写文件调用而不碰C
利用cilium/ebpf纯Go库挂载tracepoint/syscalls/sys_enter_write,实时捕获进程写入的文件描述符与字节数。
用泛型模拟类型类:实现一个安全的数值泛型算术库
Go泛型缺乏运算符重载,但通过接口约束与Numeric类型族,可以编写出支持int/float/complex的通用求和、点积函数。
组合式IO管道:实现基于io.Reader的流式加密与压缩
不借助io.Pipe,通过多层io.Reader包装实现边读边加密+gzip压缩的流式处理,内存零拷贝。
WaitGroup的进阶替代品:用channel实现可重置的计数信号量
当sync.WaitGroup无法重用或需要超时时,如何用channel构建一个支持重置、超时、动态Add的并发原语。
CGO高性能桥接:零拷贝传递多维数组与回调函数
避免CGO每次调用都复制数据:通过共享内存、切片头部转换、回调注册实现C与Go双向高效交互。
接口底层解剖:iface与eface的内存布局与动态派发开销
深入runtime的iface结构体,理解接口值存储在堆上还是栈上,类型断言与类型switch的汇编级差异。
编写Go HTTP API的模糊测试器:自动发现JSON解析漏洞
利用testing/quick与go-fuzz-headless框架对REST API进行结构化模糊测试,不仅发随机数据,还基于Schema变异。
探索 Go 中 iota 的隐藏陷阱与高阶用法
深入解析 iota 在常量组中的行为,包括跨行跳跃、位运算与枚举模式,以及常被忽视的副作用。
Slice 的隐藏扩容机制:当 append 并不安全
揭示 slice 在 append 时因底层数组共享导致的数据污染,以及如何主动控制扩容策略。
Context 超时传播的微秒级控制与取消链
超越基础用法,详解 context 的衍生树、WithTimeout 与 WithCancel 组合时的精确取消时序,以及如何避免 goroutine 泄漏。
接口的 nil 陷阱:值为 nil 的接口为何不是 nil
理解接口的动态类型与动态值,解析为何 (*int)(nil) 赋值给 interface{} 后判断为 false,并给出安全的 nil 检查模式。
Defer 执行顺序、参数求值时机与 recover 的局部作用域
逆向剖析 defer 的栈结构、参数立即求值导致的现象、以及 recover 为何仅在 defer 函数内直接调用才有效。
Goroutine 泄漏的黄金检测法:pprof 与 runtime 内省
使用 runtime/pprof 和 Net/HTTP/pprof 实时捕获泄漏的 goroutine,并展示阻塞、等待锁等静态分析技术。
Select 的随机选择机制与公平调度实战
解析 Go 运行时如何通过洗牌算法保证 select 中多个可执行 case 的随机性,并避免因无序通信导致的饥饿。
利用 unsafe.Pointer 实现结构体的零拷贝访问与字节对齐
绕过类型系统,直接操作内存布局来加速序列化、网络协议解析,并解释内存对齐导致的性能陷阱。
reflect.DeepEqual 的性能黑洞与自定义深度比较器
分析 reflect.DeepEqual 的递归反射开销,并基于类型开关、hash 和手动遍历实现更快的比较方法。
sync.Pool 的真相:自动清理、GC 与临时对象复用
揭示 sync.Pool 并非缓存池,而是用于减轻 GC 压力的临时对象复用器,并展示如何在高并发下正确使用。