-
Go Rows.Next 返回 false 而 Err 为 nil,可能是正常结束或空结果。本文区分游标消费、提前关闭、扫描与遍历错误,提供单结果集读取函数,并解释 ErrNoRows 与多结果集边界。
-
Go sort 出现顺序不稳定时,问题可能来自 Less 不满足严格弱序,也可能只是 sort.Slice 没有承诺相等元素保序。本文用多字段、浮点和稳定排序示例拆开这两个边界。
-
Go go-imap 中的消息序号是当前邮箱列表的位置,UID 是邮箱内的消息标识。本文说明 SeqSet、UIDSet、UIDSearch 和 UIDExpunge 的边界,并解释为什么跨请求缓存时还要保存邮箱与 UIDValidity。
-
Go mime/multipart.Reader 本身按部件遍历 multipart 数据,单个文件部件的大小上限要在读取当前 Part 时用 limit+1 哨兵判断。本文给出内存读取、流式落盘和请求总量限制的组合写法,说明超限后的清理与部件切换边界。
-
Go constant.ToFloat 不是把任意数值强制压成浮点数。对于复数,它只有在虚部为零时才返回实部的 Float;虚部非零时返回 Unknown。本文结合源码解释这个边界,并给出保留复数、显式取实部和拒绝输入的处理方式。
-
Bubble Tea 的 tea.Batch 适合互不依赖的命令并发组合,tea.Sequence 适合必须按顺序执行的命令。本文用原创 Go 示例说明两者的结果顺序、依赖关系、nil 命令与错误处理边界。
-
围绕 Go database/sql 事务重试边界,说明怎样识别明确死锁错误、回滚完整事务、使用有限退避,并通过统一加锁顺序、幂等设计和提交不确定性避免把重试变成重复写入。
-
Go 升级后 ZIP 字节快照失败,不一定是归档损坏。本文区分整包哈希、内部校验与成员内容,按输入、元数据和压缩器逐层判断,并给出成员级测试及发布哈希的取舍。
-
Go 1.27 新增的 strings.CutLast 会围绕最后一个分隔符返回 before、after、found,而 strings.LastIndex 只返回字节位置。本文用重复分隔符、缺少分隔符、空分隔符和中文字符串说明两者的边界。
-
Go bytes.Buffer.Grow 只预留后续写入空间,不会增加 Len。本文区分 Len、Cap 与 Grow 的语义,并用拼接示例说明如何预分配容量、复用 Buffer 和处理参数边界。
-
Go x/text/secure/precis 的用户名 profile 会按 PRECIS 规则完成字符串准备、强制和比较,因此输入字符可能被映射、折叠或因不允许而返回错误。本文说明 UsernameCaseMapped 与 UsernameCasePreserved 的区别,以及展示值、存储值和比较键如何分离。
-
Go context.Cause 看起来不稳定,通常不是 Cause 随机变化,而是父子 context 的第一次取消顺序、CancelCauseFunc 调用时机或超时 API 选择不明确。本文用最小代码拆开 Err、Cause、取消顺序和并发入口,给出可复查的排查方式。
-
Go url.ParseQuery 看起来不生效,通常不是函数没有解析,而是传入了完整 URL、忽略了 error,或把多值参数当成单值读取。本文从输入格式、url.Values、多值参数和异常编码四个边界给出排查与封装写法。
-
database/sql 中真正的 API 是 sql.Named,它返回 NamedArg;命名参数是否生效还取决于数据库驱动支持的占位符语法。本文从绑定链路、可复用查询示例和错误现象入手,说明如何在 :id、@id、$1、? 之间做正确选择。
-
Go Timer Reset 后仍读到旧事件,先看 Go 版本与 Timer 类型:Go 1.23 的 NewTimer 已保证 Reset 后不返回旧值,旧版本需要 Stop 加非阻塞排空;AfterFunc 还要单独处理并发回调。