Go语言技术文章
-
应弃用 gin.Default(),改用 gin.New() 手动注册中间件,将自定义 panic 捕获中间件置于首位,使用 c.AbortWithStatusJSON() 统一响应,区分业务 error 与 panic,避免中间件内未 recover 导致崩溃。默认的 gin.Default()345 收藏 -
Go 代码用 slices.Delete 移除大对象后,进程内存为何仍然居高不下?本文从底层数组、切片尾部引用和长生命周期缓存三个角度解释原因,并给出可验证的清零与缩容方案。344 收藏 -
context.WithoutCancel 会保留父 Context 的 Value,但故意切断 Done、Err、Deadline 和 Cause。本文用 Go 1.21+ 的最小示例说明适用场景、迁移边界与验收方法。344 收藏 -
Go HTTP 服务调用 Shutdown 后仍可能丢请求,关键不在一个函数是否返回,而在新连接、活跃连接、Keep-Alive 连接和超时窗口是否被分别处理。本文用一个可复现的停机流程拆开这些边界。343 收藏 -
用 Go 的 io.SectionReader 读取文件片段时,EOF 到底代表成功还是数据不足?本文从偏移量、剩余长度和 ReadAt 行为入手,给出一段可复查的判断代码。342 收藏 -
用 Go archive/tar 读取压缩包时,先做本地路径判断,再限制输出根目录并拒绝链接条目,最后用越界和覆盖测试验收解包逻辑。341 收藏 -
Go 1.27 让 go test 默认启用 stdversion 检查,用来发现代码使用了高于 go.mod 版本的标准库符号。本文从报错定位开始,说明 go.mod、构建标签和升级边界如何配合,并给出可复现的检查流程。339 收藏 -
用一个可复现的小例子拆开 strings.CutPrefix 与 HasPrefix 加切片的差别,重点核对 found 返回值、空前缀、相同前缀和 UTF-8 字符边界。338 收藏 -
Go 1.25 的 runtime/trace.FlightRecorder 能持续保留最近一段执行轨迹,在慢请求或健康检查异常时导出现场。本文用一个 100 毫秒慢请求阈值示例,说明 MinAge、MaxBytes、WriteTo 和 go tool trace 的配合边界。336 收藏 -
Go 1.24 完整支持带类型参数的别名声明。本文用一个从 legacy 包迁移到 collection 包的 Set API,比较 type 定义与 type 别名的差异,说明方法、导出类型、go.mod 版本和工具链兼容边界。335 收藏 -
bytes.Buffer.Reset 会清空可读数据,却保留底层存储。本文用容量、切片别名和并发边界说明复用何时有益、何时会让大块内存长期驻留。334 收藏 -
bytes.Buffer.Reset 会清空长度,却保留底层存储。本文用基准和 Cap 指标拆开 Reset、Grow、大请求复用之间的关系,给出什么时候复用、什么时候换成新 Buffer 的判断边界。333 收藏 -
环境变量里的布尔值并不只有 true 和 false。本文用 strconv.ParseBool 拆开可接受字面量、空值默认、错误回滚和配置热更新边界,给出一套不会把拼写错误静默当成关闭的 Go 配置写法。333 收藏 -
Go slog.Attr 适合把结构化字段交给日志处理器,但敏感字段不能在组装阶段被误写入。本文用请求日志场景说明 Attr 的组装顺序、脱敏边界、With 继承行为与单测核对方法。331 收藏 -
Go 语言不支持通过实现接口或方法使自定义结构体具备原生索引语法(如 s[0] 或 s[0] = x),这是由语言设计决定的硬性限制——只有内置的数组、切片、字符串和 map 类型才支持索引操作。 Go 语言不支持通过实现接口或方法使自定义结构体具备原生索引语法(如 s[0] 或 s[0] = x)330 收藏