标准库(一):IO 与系统交互
需要预先了解: 接口 包与模块:代码组织 错误处理 标准库(一):IO 与系统交互 io.Reader 和 io.Writer 是 Go 标准库最重要的两个接口,几乎所有"数据从哪里来、到哪里去"的 API 都建立在这两个接口上。这一篇讲清楚它们的语义、如何用它们拼装数据流,以及 fmt、os、bufio、time、flag 的常用部分。 io.Reader 与 io.Writer 两个接口的签名极简: type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } Read 的语义:最多读 len(p) 个字节到 p 里,返回实际读到的字节数 n。 n > 0:读到了数据,err 可能是 nil,也可能是 io.EOF(最后一个数据块同时到达末尾); n == 0, err == io.EOF:正常...
标准库(二):JSON 与 HTTP 服务
需要预先了解: 结构体与指针 标准库(一):IO 与系统交互 context 标准库(二):JSON 与 HTTP 服务 encoding/json 和 net/http 是写服务端程序的两块基石。这一篇从"结构体怎么变成 JSON"讲到"一个带中间件、超时和优雅关闭的迷你 REST 服务",把 反射与 unsafe 里看到的 tag 机制落到实际用法上。 encoding/json 基础 两个函数覆盖 90% 的场景: b, err := json.Marshal(v) // 值 -> JSON 字节切片 err = json.Unmarshal(data, &v) // JSON -> 值(必须传指针) u := User{Name: "一撮灰", Score: 98.5, Created: time.Date(2026, 9, 9, 12, 0, 0, 0, time.UTC)} b, _ := json.Marshal(u) fmt.Println...
测试
需要预先了解: 包与模块:代码组织 channel 标准库(二):JSON 与 HTTP 服务 测试 Go 把测试做成了语言工具链的一部分:_test.go 文件、go test 命令、testing 包,不需要额外框架。这一篇讲单元测试、表驱动测试、基准测试、模糊测试、示例测试和 HTTP 测试的写法,以及覆盖率怎么读。 测试文件的组织 测试代码放在以 _test.go 结尾的文件里,和被测试代码同一个目录: calc/ ├── calc.go // package calc ├── calc_test.go // package calc(同包测试) └── calc_ext_test.go // package calc_test(外部测试包) 两种包名的区别: 写法 能访问 适合 package calc 包内所有标识符(含未导出的) 测试内部实现 package calc_test 只有导出的标识符 测试对外 API,避免依赖...
性能分析与调优
需要预先了解: 内存分配与逃逸分析 垃圾回收 测试 性能分析与调优 性能优化的第一条原则是先测量,再优化。凭直觉猜"哪里慢"十有八九猜错,而且容易把代码改得更复杂却没有任何收益。Go 工具链把测量能力做得很完整:testing 做基准、pprof 找热点、trace 看调度。 方法论 建立基线:用 testing.B 写基准测试,记录当前的 ns/op、B/op、allocs/op; 找到瓶颈:用 pprof 看 CPU/内存/阻塞的分布,而不是猜; 只改一个变量:一次改一处,改完重新测量; 验证收益:与基线对比,没有明显提升就回退; 防止退化:把关键基准保留在仓库里,配合 CI 定期跑。 优化的收益通常遵循帕累托分布:少数几处热点贡献了大部分开销。先解决它们,再考虑细节。 采集 profile 文件式采集(runtime/pprof) 在程序里显式启动: f, _ := os.Create("cpu.prof") pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() ...



