Go HTTP 客户端中间件入门:给外部调用加日志、重试和请求 ID
客户端也需要中间件 我们经常给 HTTP 服务端写中间件:请求日志、鉴权、恢复 panic、请求 ID。其实 HTTP 客户端也有类似需求。调用外部 API 时,你可能希望统一加 User-Agent、加请求 ID、记录耗时、对 502/503 做有限重试。Go 标准库通过 支持这种扩展。
posts
客户端也需要中间件 我们经常给 HTTP 服务端写中间件:请求日志、鉴权、恢复 panic、请求 ID。其实 HTTP 客户端也有类似需求。调用外部 API 时,你可能希望统一加 User-Agent、加请求 ID、记录耗时、对 502/503 做有限重试。Go 标准库通过 支持这种扩展。
本文讲解 Go HTTP ResponseController 的基本使用场景,包括 Flush、写入截止时间和流式响应,让初学者理解响应控制边界。
全面掌握 Go 测试进阶技巧:表驱动测试、子测试、测试辅助、Mock 模式、集成测试、基准测试、模糊测试、覆盖率分析与 CI/CD 集成
本文讲解 Go encoding/json 的流式 Decoder 和 Encoder,适合处理大 JSON 数组、日志导出和 HTTP 请求体。
深入探索 Go 1.21 引入的 cmp、slices、maps 三个标准库包,掌握基于 cmp.Ordered 约束的集合操作,告别手写循环
很多小工具终于不用自己写 Go 早期处理切片和 map 时,经常要自己写辅助函数:判断切片是否包含元素、克隆切片、比较切片、复制 map、按字段排序。每个项目都会有一组差不多的 。Go 1.21 把 、 、 等包带进标准库,让这些常见集合操作更统一。
本文讲解 Go pprof 在 HTTP 服务中的基本使用方式,包括启用调试端口、采集 CPU profile、查看内存分配和安全注意事项。
本文讲解 Go 1.21 标准库 log/slog 的基本使用,包括文本日志、JSON 日志、字段、With 和 HTTP 请求日志。
Go 1.21 slog:标准库的结构化日志 日志,是每个后端工程师绕不开的话题。你可能用过 、 、 这些第三方库,也可能还在用标准库的 包拼接字符串。不管怎样,Go 1.21 给你带来了一个"迟到但正确"的礼物—— 包。
本文讲解 Go race detector 的基本用法,通过计数器、map 并发写入和 HTTP 指标示例说明如何发现并修复数据竞争。
全面掌握 Go HTTP 服务器的生产级模式:Go 1.22 增强路由、中间件、优雅停机、健康检查、Request ID、超时处理
本文讲解 Go 1.20 中 context.WithCancelCause 和 context.Cause 的基本用法,帮助初学者写出更容易排查的取消链路。
为什么要把资源打进二进制 Go 程序发布时常常是一个二进制文件,这很方便。但只要你的程序依赖模板、CSS、默认配置、SQL 迁移脚本或静态图片,发布就不再只是复制一个文件。你需要保证资源目录也在正确位置,工作目录也正确。很多“小工具在我机器上能跑,复制到服务器就找不到模板”的问题都来自这里。
本文讲解 Go HTTP 服务中 ReadTimeout、WriteTimeout、IdleTimeout 和请求 context 的基本用法,帮助初学者避免服务被慢请求拖住。
Go 1.20 新特性:让错误处理更优雅 2023 年 2 月,Go 1.20 正式发布。虽然不像 1.18 那样引入了泛型这样的重大特性,但 1.20 在错误处理、类型转换和性能方面带来了许多实用的改进。
本文用批量校验、资源关闭和并发任务三个例子讲解 Go 1.20 errors.Join 的基本用法,帮助初学者理解多错误处理的边界。
错误处理的高级技巧:从基础到企业级 Go 的错误处理以其简洁性著称,但简洁不等于简单。在实际项目中,我们需要处理复杂的错误场景:错误包装、错误链、错误分类、错误监控等。本文将带你从基础的错误处理进阶到企业级的错误处理策略。
小服务也需要知道自己发生了什么 可观测性听起来像大系统话题,容易让初学者联想到复杂的指标平台、分布式追踪和日志集群。其实对一个 Go 小服务来说,最基础的可观测性很朴素:服务是否还活着?请求进来了多少?哪些请求失败?外部调用耗时多久?启动时用了什么配置? 如果这些信息都没有,服务出问题时只能靠猜。
从切片工具函数学习泛型最自然 Go 1.18 有了泛型后,最容易上手的练习就是切片工具函数。因为切片处理在业务代码里非常常见:过滤活跃用户、提取 ID、计算总金额、把数据库结果转成响应结构体。过去这些函数要么针对具体类型写,要么使用 损失类型安全。泛型让它们变得更自然。
any 只是 interface{} 的别名 Go 1.18 引入泛型时,也引入了一个新预声明标识符: 。很多初学者会以为它是新类型,其实它只是: 也就是说, 和 完全等价。它的出现主要是为了让泛型代码更易读: 这比写 更短,也更符合“没有额外约束”的语义。