Go语言技术文章
-
Go 1.20 引入 unsafe.StringData、unsafe.String 和 unsafe.SliceData 后,字符串与字节切片之间可以少一次复制,但指针生命周期、只读约束和空字符串边界必须一起核验。本文用可复现实验拆开这些风险。197 收藏 -
用 Go 原生 fuzz 测试把线上边界输入沉淀为种子语料,说明失败样本如何复现、加入回归集,并在 CI 中验收执行结果。358 收藏 -
用 Go 标准库 log/slog 的 Handler.WithGroup 组织请求、用户和数据库字段,比较文本与 JSON 输出,并验证自定义 Handler 的实现边界。485 收藏 -
sync.Cond 的 Broadcast 只负责唤醒等待者,不代表条件已经属于当前协程。本文从有界队列场景拆解 Wait、Signal、Broadcast 的配合方式,解释为什么必须在循环中检查共享状态,并给出可运行的 Go 验证代码、错误写法和回归清单。414 收藏 -
通过 Go 的 os.LookupEnv 与 os.Getenv 示例,说明空字符串和未设置的区别,并给出配置回退、必填校验与测试隔离的实用写法。381 收藏 -
围绕 Go maps.DeleteFunc 清理不合格键,解释回调遍历期间的删除语义、判定函数副作用、nil map 行为与并发安全边界,并给出可验证的代码和检查清单。141 收藏 -
Go 1.21 的 log/slog 提供了 NewLogLogger,把旧式 log.Logger 的 Output 调用桥接到结构化 Handler。本文用 HTTP 服务迁移场景说明级别映射、属性保留、前缀与迁移边界,并给出可回归的日志核对方法。398 收藏 -
time.Ticker.Stop 之后是否还能从 C 通道读到一次事件,取决于 Go 版本、go.mod 语义和退出代码的写法。本文用一个定时刷新任务拆解 Stop 不关闭通道、select 退出、Go 1.23 同步 ticker 通道以及旧版本兼容边界。355 收藏 -
解释 Go http.Request.GetBody 的生成条件,区分可重读请求与流式请求,并给出重试、内存控制和上传场景的检查方法。431 收藏 -
解释 Go context 取消后 goroutine 仍可能继续工作的原因,给出 select 监听、资源释放、退出确认和可复现检查方法。389 收藏 -
用 Go 的 http.Server.ConnState 观察连接从建立、活跃、空闲到关闭的状态变化,并结合超时和异常断开日志定位连接问题。425 收藏 -
Golang · Go问答 | 3星期前 | 并发 · 错误处理 · Context · Go问答 · Go 错误日志 超时 context.WithCancelCause context.Cause 取消原因
只记录 context.Err() 时,Go 服务通常只能看到 context canceled 或 deadline exceeded,无法判断是上游主动取消、下游超时还是业务熔断。本文用 context.WithCancelCause 和 context.Cause 传递可诊断的取消原因,并说明父子 Context、超时边界与日志落点。191 收藏 -
Go 1.21 引入的一次性值函数适合把一次性计算封装成并发安全的惰性值。本文从配置快照加载场景出发,说明它的最小写法、panic 语义、错误值处理、旧版本兼容和上线前检查边界。314 收藏 -
用一个可运行的 Go 示例拆开 reflect.Value 的 CanSet、CanInterface 和 MethodByName 边界,说明什么时候会 panic,以及如何在反射入口先做类型、有效性和可导出性检查。407 收藏 -
Go 1.21 引入的 clear 可以把切片元素重置为类型零值,尤其适合切断指针切片和含引用字段的对象链。本文从数组范围、别名切片和旧工具链兼容三个边界说明它怎么用、哪里容易清错。213 收藏