Go教程技术文章
-
Go 解析 X.509 证书时,未知扩展应从 Certificate.Extensions 读取原始 OID、Critical 和 Value;重新生成证书则使用 ExtraExtensions,并单独处理未知关键扩展。489 收藏 -
Go 的 subtle.ConstantTimeCompare 不是任意字符串比较器:长度不同会立即返回 0。本文解释这一设计如何约束耗时模型,并用固定长度摘要给出正确用法。218 收藏 -
Go crypto/rand.Reader 的类型是 io.Reader,固定长度随机字节不能假设一次 Read 填满缓冲区。本文用 io.ReadFull 处理短读,并解释 n、EOF 与错误的判断边界。232 收藏 -
Go slog.HandlerOptions.Level 是日志最低级别门槛。本文用 TextHandler 和 JSONHandler 说明如何过滤 Debug,如何用 LevelVar 动态打开调试日志,并排查默认 logger、独立 logger 与性能开关不生效的问题。498 收藏 -
用 Go slog.LogValuer 为包含 token 和邮箱的业务对象定义安全日志表示,只输出 request_id、账号后缀和状态摘要;同时说明 LogValuer、Value.Resolve 与 ReplaceAttr 的职责边界。398 收藏 -
Go 的 log/slog 可以为同一请求派生一个带 WithGroup 和 With 公共属性的 logger,让 request_id、method、path 等字段自动出现在后续日志中。本文说明派生作用域、TextHandler 与 JSONHandler 的输出差异,以及 WithGroup 和 slog.Group 的选择。272 收藏 -
Go embed.FS 可以把模板目录嵌入二进制,再用 fs.Glob 按模式批量收集并交给 template.ParseFS。本文说明单层匹配、无匹配、非法模式和多层目录的处理边界。119 收藏 -
使用 Go embed.FS.ReadFile 读取内置资源时,不要只比较错误字符串。本文从 io/fs 的路径规则出发,演示如何用 errors.Is 判断资源不存在,再用 errors.As 读取 PathError 的操作名、路径和底层原因。211 收藏 -
讲清 Go embed.FS 读取请求资源时 fs.ValidPath 的斜杠路径规则、反斜杠边界,以及如何区分非法路径和资源不存在。194 收藏 -
sync.OnceFunc 的 panic 不是一次性失败后自动重试,而是被缓存并在后续调用中用同一个值再次 panic。本文拆解实现状态、栈信息差异和可重试初始化的替代写法。249 收藏 -
讲清 Go sync.Cond 的可靠等待写法:为什么 Wait 返回后必须用 for 重新检查共享条件,如何配合 Locker 实现有界条件队列,以及 Cond、channel、Mutex 的选型边界。328 收藏 -
用 Go 的 atomic.Bool 实现并发开关,掌握 Load、Store、Swap、CompareAndSwap 的选择,以及原子状态与配置可见性的边界。257 收藏 -
用 Go atomic.Pointer[Config] 发布不可变配置快照,说明 Store、Load、切片复制、map 隔离和多字段一致性的工程边界。334 收藏 -
Go 1.19 及以上项目通常优先使用 atomic.Int64;兼容旧版本或已有 *int64 接口时继续使用旧式原子函数。本文从 API 形状、计数器迁移、版本、对齐和复制约束说明如何选择。130 收藏 -
Go sync.Map.Range 能安全地遍历并发 Map,却不保证一次一致快照。本文从线上统计读数漂移切入,解释并发 Store/Delete 的影响、回调边界和需要快照时的替代方案。428 收藏