Go语言技术文章
-
用一个可复现的 Go 测试示例讲清 testing.T.Cleanup 的注册时机、后进先出顺序、子测试边界和 t.Parallel 下的安全清理方式。298 收藏 -
Go 程序用 os.CreateTemp 创建临时文件后,删除失败往往不是路径问题,而是文件句柄仍被占用。本文用一个可复现的导入场景拆开 CreateTemp、Close、Remove 的顺序,并说明 Windows 与 Unix 文件系统的行为差异、错误定位和安全清理写法。435 收藏 -
Go 程序在本地和服务器上解析出不同时间,通常不是时钟坏了,而是输入是否带时区、time.Parse 使用的 Location 以及序列化格式没有对齐。本文用最小实验拆开这三个边界,并给出可回归的处理方式。161 收藏 -
Go 的一次性初始化函数适合把昂贵加载包装成只执行一次的调用,但也会把第一次返回的错误一起缓存。本文用配置加载示例说明并发安全、失败重试和可测试边界。160 收藏 -
Go 泛型中的数值约束不只是把 int 和 float64 列出来,还要处理底层类型、~ 运算符、接口组合和类型推断。本文用一个可运行的统计函数拆解约束边界。238 收藏 -
自定义 http.RoundTripper 做重试时,真正容易出错的不是循环次数,而是请求体能否重放、方法是否幂等以及错误如何返回。本文用一个可运行的重试 Transport 拆开这三个边界。457 收藏 -
Go 的 map 不能用 == 比较内容,只有和 nil 比较才合法。本文从可比较类型规则出发,拆解 len、reflect.DeepEqual 与排序后序列化三种校验方式的边界,并给出测试和生产代码中的选择建议。369 收藏 -
用 Go log/slog 自定义 Handler,为健康检查、普通请求和故障请求设置不同日志门槛,同时保留 request_id 等关键上下文,避免线上日志降噪后失去排查线索。500 收藏 -
Go 1.25 已将 testing/synctest 从实验能力带入标准库,升级到 Go 1.26 后应移除 GOEXPERIMENT=synctest,并把旧实验 API 改成正式包导入;本文用最小并发测试说明迁移、检查与回退边界。248 收藏 -
errors.Join 可以把一次流程中的多条错误组成可检查的错误树,但日志展示、errors.Is 匹配和 errors.As 提取要分开设计。本文用批量校验示例说明组合、判断、展示与测试边界。301 收藏 -
Go channel 关闭后,接收方可以用 comma-ok 判断状态,也可以用 range 自动读到结束;真正容易出错的是发送方与关闭方的职责边界。本文用最小示例说明判断、排空和并发收尾的正确写法。142 收藏 -
Go 泛型约束不是把类型随便放进尖括号,而是用类型集合明确允许哪些类型,并把可比较、可排序等操作边界交给编译器检查。本文用可比较键和值排序两个例子说明约束写法、~ 底层类型和常见误区。111 收藏 -
Go 1.26 放宽了 new 的参数限制,可以直接用 new(expr) 创建带初始值的指针。本文用可选字段、版本门槛和迁移验证说明它解决什么问题,以及什么时候不该急着改写。476 收藏 -
用一个配置加载器看懂 Go 一次性初始化的惰性加载、错误复用和并发安全边界,给出可验证的最小实现与避坑清单。125 收藏 -
Go 代码用 slices.Delete 移除大对象后,进程内存为何仍然居高不下?本文从底层数组、切片尾部引用和长生命周期缓存三个角度解释原因,并给出可验证的清零与缩容方案。344 收藏