Go语言技术文章
-
反复调用 regexp.MatchString 时,包级函数会把正则编译带进热路径。本文拆开调用链,给出固定模式与动态模式两种缓存设计,并处理并发、编译失败和容量边界。364 收藏 -
Go 并发代码里,原子计数器并不会自动保护同一结构体中的普通字段。本文从快照偶发不一致的故障现场出发,说明混用为什么仍会产生竞态,并给出全原子、互斥锁和原子快照的修复边界。360 收藏 -
Go sync.RWMutex.TryLock 会尝试获得写锁并立即返回结果。本文用缓存刷新场景说明它与 Lock 的阻塞差异、成功后的 Unlock 责任,以及何时可以跳过一次写入、何时必须排队完成。360 收藏 -
Go 模糊测试默认会让多个 worker 并发调用 fuzz target,固定临时文件名因此可能被覆盖或提前删除。本文用 t.TempDir、os.CreateTemp 和目录注入给出可复现、可清理的修复方式。358 收藏 -
testing/quick.Check 的随机失败要靠可复用的随机源来复现。本文说明如何记录 CheckError.In、Count 和 seed,并保持 Config、Generator 与迭代上限不变,稳定重跑同一组输入。352 收藏 -
Go strings.Reader 的 Read 会推进当前位置,而 ReadAt 按显式字节偏移读取且不会改变后续 Read 的位置。本文用 Len、Size 和短读错误说明两者的边界。351 收藏 -
Go 的 database/sql Conn.Raw 适合短暂访问驱动特有能力,但底层 driver.Conn 只能在回调期间使用。本文用一个连接池场景说明借用、错误传播、归还和并发边界。347 收藏 -
用 io.NewSectionReader 为大文件建立固定偏移和长度的只读视图,再通过 io.Copy、ReadAt 和 Seek 导出或读取指定区间,避免先把整个文件加载进内存。347 收藏 -
Go 的 pem.Block.Headers 用 map[string]string 表示 PEM 外层的可选键值头部。本文通过 Encode 和 Decode 示例说明如何保存、读取自定义元数据,并处理空头部、重复键和编码失败等边界。346 收藏 -
Go binary.Uvarint 返回 n=0 不是解出了数字 0,而是当前缓冲区还不够完整;n<0 则表示溢出。本文从分片输入场景出发,给出三种返回值的判断、游标推进、尾部保留和 ReadUvarint 选择方法。346 收藏 -
Go database/sql/driver.Validator 的 IsValid 只返回布尔值,不会直接返回 ErrBadConn。本文结合连接归还池的时机,说明 false 如何让失效连接被丢弃,以及 ErrBadConn 何时才适合交给 database/sql 触发新连接重试。344 收藏 -
Go database/sql 的 Scanner 接收到的 []byte 可能由驱动暂时拥有,下一次 Scan 后就不再适合长期引用。本文区分 *[]byte、sql.RawBytes、interface{} 和自定义 Scanner 的复制边界。343 收藏 -
Go 的 context.AfterFunc 回调是在上下文取消后异步启动的,stop 返回 true 才表示回调被阻止;返回 false 不等于回调已经完成。本文按取消、停止和完成三个时刻拆解排查方法,并给出可等待回调收尾的写法。342 收藏 -
面向以 -cover 构建的长期运行程序,说明 Go runtime/coverage.WriteCountersDir 生成的计数快照如何与匹配的元数据配合,并用 go tool covdata 做汇总分析。341 收藏 -
Go container/list.MoveAfter 传入同一个节点时不会改变顺序,因为 e == mark 没有新的位置;本文进一步区分节点值相同、已经相邻和跨链表节点的边界。340 收藏