-
Go json.Decoder.UseNumber 只改变解码到 interface{} 时的数值类型,不是 Marshal 的全局开关。本文拆开 float64、json.Number、string 与 RawMessage 的边界,说明何时能保留数字字面量、何时已经无法恢复原始表示。
-
QueryContext 取消后连接仍显示存在,通常是连接被归还连接池而不是立即断开;只有 Rows 未关闭、驱动不响应取消或专用连接未 Close 时,才需要继续排查资源占用。
-
sql.NullString 用于接收数据库 NULL,但它没有把自身自动编码为 JSON null。本文从 String、Valid 两个字段解释输出为何是对象,并给出接口层输出 null 的两种稳妥写法。
-
Go database/sql 的 Tx.Commit 会把提交动作交给底层驱动,连接中断、事务上下文取消或事务已结束都可能让调用方得到错误。本文按错误边界说明如何判断提交结果,以及为什么不能对未知状态盲目重试。
-
Go 中 defer 只能在所属函数返回时执行清理,不能自动停止另一个 goroutine。本文用 context.Done、显式 cancel 和 WaitGroup 拆开取消信号、worker 退出与资源回收三个职责,说明周期任务和阻塞调用的排查边界。
-
Go select 的多个通信分支同时就绪时,会从可继续的分支中做均匀伪随机选择,不会按 case 的书写顺序固定优先。本文结合排查现场、统计观察和显式优先处理方案,说明 nil channel、关闭 channel 与 default 的边界。
-
解释 Go channel 关闭后 len 与 cap 的实际含义,演示如何用双值接收排空缓冲数据,并说明为什么不能用 len(ch)==0 判断关闭状态。
-
Go 中声明但没有 make 的 channel 值是 nil,发送、接收和 range 都不会找到通信对象,因此会永久阻塞。本文对比 nil channel、空缓冲 channel 和已关闭 channel,给出初始化、nil 防护以及 context 超时的实用写法。
-
Go RWMutex 在写者等待时会阻塞后续读者,长读临界区可能放大延迟。本文以配置查询示例说明锁内复制、锁外处理,并解释递归读锁、升级锁和共享引用的限制。
-
Go atomic.Value 的第一次 Store 会建立具体动态类型契约,后续 Store、Swap 和 CompareAndSwap 必须保持一致。本文说明零值、Config 快照、并发读取与常见 panic 的排查边界。
-
Go sync.Cond 的 Signal 只是唤醒提示,不代表共享条件已经成立,也不会保存无人等待时的通知。本文用队列示例说明为什么 Wait 必须在持锁的 for 循环中重新检查状态,以及状态修改、Signal 和 Broadcast 的配合边界。
-
math/big.Int 可以保存超出 int64 的整数,但 Int64 在越界时不能作为可靠结果使用。本文从失真现象出发,说明如何用 IsInt64 先判断范围,再决定安全转换或继续保留大整数。
-
io.LimitReader 在达到上限后也会返回 EOF,因此单看 EOF 不能判断底层数据是否自然结束。本文解释 LimitedReader.N 的含义,并用 limit+1 的受控读取方式识别输入是否超限。
-
time.Ticker 的 C 通道不是可观测的任务队列,不能用 len 或 cap 判断业务积压。本文解释 Go 1.23 的同步 timer channel 变化,并给出非阻塞接收与显式 backlog 统计的写法。
-
http.Request.Pattern 记录的是 ServeMux 为请求匹配到的注册模式;如果处理器被直接调用、请求没有经过 ServeMux,或只调用了 ServeMux.Handler,字段就可能为空。本文拆开这些边界,给出正确的观测位置和排查方法。