Go语言技术文章
-
Go 的缓冲 channel 满载后,普通发送会等待消费者。用 select 同时监听 ch <- value 与 ctx.Done(),就能在取消或超时后返回 ctx.Err,避免生产者 goroutine 一直卡住。100 收藏 -
Go 解析 X.509 证书时,未知扩展应从 Certificate.Extensions 读取原始 OID、Critical 和 Value;重新生成证书则使用 ExtraExtensions,并单独处理未知关键扩展。489 收藏 -
Go 的 <-chan 参数只能接收,不能发送或调用 close。本文解释单向通道的类型权限、关闭责任和安全的函数签名写法。459 收藏 -
Go 的 subtle.ConstantTimeCompare 不是任意字符串比较器:长度不同会立即返回 0。本文解释这一设计如何约束耗时模型,并用固定长度摘要给出正确用法。218 收藏 -
Go 的 copy 可以安全处理共享底层数组的重叠切片。本文从源切片、目标切片和复制数量入手,说明切片移动、扩容复制以及三索引切片限制之间的区别。259 收藏 -
Go crypto/rand.Reader 的类型是 io.Reader,固定长度随机字节不能假设一次 Read 填满缓冲区。本文用 io.ReadFull 处理短读,并解释 n、EOF 与错误的判断边界。232 收藏 -
Go 1.21 起可以用 clear 清空 map。它保证删除所有条目并保留 map 的可写语义,但 Go 没有 map 的 cap 接口,也没有承诺 clear 立即释放底层存储。本文用别名、nil map 和重新 make 的对比说明什么时候只是清空内容,什么时候应该替换整个 map。277 收藏 -
Go slog.HandlerOptions.Level 是日志最低级别门槛。本文用 TextHandler 和 JSONHandler 说明如何过滤 Debug,如何用 LevelVar 动态打开调试日志,并排查默认 logger、独立 logger 与性能开关不生效的问题。498 收藏 -
循环里写 defer f.Close() 时,Close 不会在本轮循环结束,而会等外围函数返回。本文解释原因,并给出单次迭代函数、关闭错误处理和资源边界选择。167 收藏 -
用 Go slog.LogValuer 为包含 token 和邮箱的业务对象定义安全日志表示,只输出 request_id、账号后缀和状态摘要;同时说明 LogValuer、Value.Resolve 与 ReplaceAttr 的职责边界。398 收藏 -
自定义错误想让 errors.Is 匹配,关键是实现 Is(error) bool;Error 只负责展示,Unwrap 只负责暴露包装链。本文用配额错误小项目演示哨兵错误、%w 包装、浅比较和误匹配测试。246 收藏 -
Go 的 log/slog 可以为同一请求派生一个带 WithGroup 和 With 公共属性的 logger,让 request_id、method、path 等字段自动出现在后续日志中。本文说明派生作用域、TextHandler 与 JSONHandler 的输出差异,以及 WithGroup 和 slog.Group 的选择。272 收藏 -
清理函数再次 panic 时,直接让第二个 panic 穿过 defer 可能遮住业务异常。本文用局部 recover 和 PanicChain 保留两类信息,并说明三种结果如何处理。300 收藏 -
Go embed.FS 可以把模板目录嵌入二进制,再用 fs.Glob 按模式批量收集并交给 template.ParseFS。本文说明单层匹配、无匹配、非法模式和多层目录的处理边界。119 收藏 -
Go defer 不能凭空改写普通返回表达式。本文对比命名返回值、指针和闭包的作用范围,说明 return 与 defer 的执行关系,并给出错误包装和资源清理的选择边界。198 收藏