Go语言技术文章
-
解释 Go channel 关闭后 len 与 cap 的实际含义,演示如何用双值接收排空缓冲数据,并说明为什么不能用 len(ch)==0 判断关闭状态。141 收藏 -
Go 中声明但没有 make 的 channel 值是 nil,发送、接收和 range 都不会找到通信对象,因此会永久阻塞。本文对比 nil channel、空缓冲 channel 和已关闭 channel,给出初始化、nil 防护以及 context 超时的实用写法。427 收藏 -
Go RWMutex 在写者等待时会阻塞后续读者,长读临界区可能放大延迟。本文以配置查询示例说明锁内复制、锁外处理,并解释递归读锁、升级锁和共享引用的限制。298 收藏 -
Go atomic.Value 的第一次 Store 会建立具体动态类型契约,后续 Store、Swap 和 CompareAndSwap 必须保持一致。本文说明零值、Config 快照、并发读取与常见 panic 的排查边界。412 收藏 -
Go sync.Cond 的 Signal 只是唤醒提示,不代表共享条件已经成立,也不会保存无人等待时的通知。本文用队列示例说明为什么 Wait 必须在持锁的 for 循环中重新检查状态,以及状态修改、Signal 和 Broadcast 的配合边界。422 收藏 -
math/big.Int 可以保存超出 int64 的整数,但 Int64 在越界时不能作为可靠结果使用。本文从失真现象出发,说明如何用 IsInt64 先判断范围,再决定安全转换或继续保留大整数。159 收藏 -
io.LimitReader 在达到上限后也会返回 EOF,因此单看 EOF 不能判断底层数据是否自然结束。本文解释 LimitedReader.N 的含义,并用 limit+1 的受控读取方式识别输入是否超限。245 收藏 -
time.Ticker 的 C 通道不是可观测的任务队列,不能用 len 或 cap 判断业务积压。本文解释 Go 1.23 的同步 timer channel 变化,并给出非阻塞接收与显式 backlog 统计的写法。143 收藏 -
http.Request.Pattern 记录的是 ServeMux 为请求匹配到的注册模式;如果处理器被直接调用、请求没有经过 ServeMux,或只调用了 ServeMux.Handler,字段就可能为空。本文拆开这些边界,给出正确的观测位置和排查方法。299 收藏 -
Go time.Format 用固定参考时间片段识别年月日和时分秒,输出值来自实际时间。通过固定日期示例,说明补零、小数秒、12小时制与时区,并区分布局和目标日期。242 收藏 -
时间格式化只展示部分墙上时钟信息,time.Time.Equal 比较的是时间瞬间;两个值都带单调时钟读数时,还可能按单调读数比较。本文解释相同文本却返回 false 的原因,以及 Round(0)、UTC、Parse 和 Equal 的正确边界。114 收藏 -
http.DetectContentType 最多只检查输入前 512 字节,不足 512 字节的短内容仍可参与判断,无法识别时返回 application/octet-stream。本文用流式采样示例说明读取上限、默认结果与后续校验边界。446 收藏 -
tar.Reader.Next 消费的通常不是目录自己的文件内容,而是当前条目未读数据和块填充,以便流位置落到下一个头部。本文解释目录、Header.Size、Typeflag、PAX/GNU 元数据和安全错误之间的关系,并给出安全遍历写法。348 收藏 -
zip.Writer.Close 不只是关闭一个对象,它还要结束当前条目、补写中央目录和结束记录,并刷新内部缓冲,因此部分写入错误会在最后才返回。本文拆开这些职责,说明为什么必须同时检查 Create、Write 和 Close。110 收藏 -
gzip.Reader 的完整性校验依赖读取到 EOF,不能用 Close 成功替代。本文区分读取与关闭错误,提供限制解压大小的完整示例,并说明提前停止、多成员和底层资源的处理边界。417 收藏