Go语言技术文章
-
用 Go crypto/subtle.ConstantTimeCompare 做密钥或摘要校验时,长度不一致会直接返回 false。本文从源码语义、输入预处理和可复现测试三个角度说明如何避免误判与边界漏洞。412 收藏 -
Go 的 io.ByteScanner.UnreadByte 不是通用回退栈:它只约定回退最近一次成功的 ReadByte。本文用 token 读取示例说明连续回退、其他读取操作和 EOF 后的状态边界。412 收藏 -
sort.Search 找不到目标时返回 len 并不是越界,而是把第一个满足条件的位置定义为插入点。本文用单调谓词、边界表和可运行代码说明闭区间、找不到与插入位置的关系。411 收藏 -
讲清 os.File.Truncate 改短文件时的文件长度、当前偏移量和落盘检查,给出可复现的配置文件更新写法。411 收藏 -
Go slog 适合结构化记录请求和业务事件,但把请求对象直接写入日志很容易带出手机号、令牌或地址。本文用字段白名单、LogValuer 和审计分层,搭一套可检查、可回退的日志边界。410 收藏 -
io/fs.ValidPath 专门判断文件系统接口使用的相对路径是否合规。本文从点号、斜杠、空路径和归档条目四个边界入手,给出可运行的校验代码以及如何避免把合法嵌套路径误判成危险输入。408 收藏 -
用一个懒加载配置的实战场景,拆解 Go sync 标准库如何让并发调用共享一次初始化结果,重点说明错误也会被缓存、失败重试为何必须创建新实例,以及如何用测试验证并发语义。408 收藏 -
Go 1.25 为 testing.T、B、F 增加了 Output 方法。它把 io.Writer 接到同一条测试输出流,保留测试归属和内部缓冲,适合替代 fmt.Println 记录并行测试日志。本文拆开调用链、换行刷新和生命周期边界。408 收藏 -
用一个可运行的 Go 示例拆开 reflect.Value 的 CanSet、CanInterface 和 MethodByName 边界,说明什么时候会 panic,以及如何在反射入口先做类型、有效性和可导出性检查。407 收藏 -
用 testing.TB.Context 把测试生命周期传给子协程,处理取消时机、Cleanup 顺序和 goroutine 退出验收,避免测试结束后仍有后台工作。407 收藏 -
slog.LogValuer 可以把复杂对象转换成结构化日志值,但如果直接把令牌、邮箱或请求头塞进 Attr,日志脱敏就会失效。本文从 LogValue 的降级边界出发,演示组字段、零值和审计检查如何组合,避免调试信息变成敏感数据出口。403 收藏 -
io.Pipe 没有内部缓冲,它用同步的 PipeReader 和 PipeWriter 把生产者与消费者接起来。本文用一个流式导出示例说明 Write 为什么会阻塞、CloseWithError 如何传递失败,以及怎样避免 goroutine 泄漏。403 收藏 -
用户输入被拼进 Go 正则表达式时,regexp.QuoteMeta 可以把元字符变成字面量。本文用搜索过滤场景拆开转义、拼接、匹配和空输入边界。400 收藏 -
从 Logger、Handler、WithAttrs 和 WithGroup 的调用关系入手,解释结构化日志字段如何进入 Record,以及自定义 Handler 面对并发写入时应该承担哪些边界。400 收藏 -
围绕 database/sql.Rows.NextResultSet 处理多结果集,讲清 Next、Scan、NextResultSet、Err 和 Close 的调用顺序,并用空结果集与驱动支持差异做实战核对。399 收藏