Go语言技术文章
-
Go 1.23 起,失去引用的 time.After 定时器可以被回收,但高频循环每轮创建 timer 和 channel 仍有分配与调度成本。本文说明 time.After 的适用边界,以及如何用可复用 Timer 配合 Stop、排空和 Reset。501 收藏 -
Go 用 io.CopyN 从网络连接复制固定块时,完整条件不是只看错误是否为空;本文说明如何设置 SetReadDeadline,结合 written、io.EOF 和 os.ErrDeadlineExceeded 处理半包、总时限与空闲超时。447 收藏 -
Go select 没有 default 并不是异常:当所有通信 case 都暂时不可执行时,当前 goroutine 会等待;本文区分缓冲、关闭和 nil channel,并给出 default、超时与取消的选择方法。427 收藏 -
使用 Go io.CopyN 写归档文件时,不能只看目标文件是否存在;本文用 written、err、临时文件和 Stat 组合确认目标长度,避免把部分归档误当成功。470 收藏 -
Go select 同时命中多个 ready case 时不会按书写顺序执行,而是从可继续的通信中选择一个。本文解释 ready、default、关闭通道和优先级改写之间的边界。225 收藏 -
解释 Go io.CopyN 返回 ErrUnexpectedEOF 的真实来源:普通短源输入通常是 io.EOF,而底层 Reader 已报告结构化数据截断时,CopyN 会保留该错误。文章给出 written、err、ReadFull 和调用方兼容处理的判断方法。199 收藏 -
Go 的 range 接收循环不会因为暂时没有值就结束,必须等 channel 被关闭并且关闭前发送的值全部取出。本文说明关闭责任、双值接收、nil channel、缓冲 channel 和多发送方协调的边界。238 收藏 -
Go 服务端处理上传或请求体时,通常先用 MaxBytesReader 设定请求级上限,再用 io.LimitReader 限制一次业务读取;本文解释两者的错误、关闭和超限判断差异。281 收藏 -
Go channel 的关闭责任应由能确认所有发送结束的一方承担。本文用单发送方、多发送方和取消信号三个场景,说明如何避免向已关闭 channel 发送导致 panic。393 收藏 -
io.LimitReader 到达 N 字节后会主动返回 EOF,后续底层错误自然无法被观察。本文用请求体上限场景说明错误为何消失,并给出 max+1 检测超限的写法。180 收藏 -
Go channel 关闭后接收仍会得到元素类型的零值,不能只看 v 判断结束。本文用 comma-ok 区分有效零值、关闭空 channel 和 nil channel,并说明缓冲 channel 的正确消费方式。361 收藏 -
用 Go io.LimitReader 限制上传时,不能只看 EOF;把读取上限设为 maxBytes+1,再根据实际读取字节数判断是否超限。333 收藏 -
解释 Go 中 nil channel 的阻塞语义,以及如何用 select default 对可选通道做非阻塞尝试,同时区分 nil、未就绪和 closed channel。183 收藏 -
讲清 Go io.ReadFull 读取固定二进制头部时的缓冲区安排:先读定长头,再校验长度并分配载荷,区分 EOF 与 ErrUnexpectedEOF。427 收藏 -
Go 中从 nil channel 接收不会返回零值,而是永久阻塞;只有已关闭且已耗尽的 channel 才会返回元素类型零值并令 ok 为 false。本文用状态对比和可取消示例说明排查与修复边界。111 收藏