Go语言技术文章
-
Go bufio.Reader 的 ReadString 和 ReadBytes 都能按分隔符读取一行,但返回类型、数据转换和末尾 io.EOF 的处理不同。本文用示例说明两者怎么选。258 收藏 -
Golang · Go问答 | 2星期前 | Context · 并发控制 · Go问答 · Go 资源清理 sync.Once context.WithCancel context.CancelFunc
Go 的 CancelFunc 可以被多个 goroutine 重复调用,但这不代表文件、连接和事务清理也天然幂等。本文用统一停止入口、等待工作退出和 sync.Once 设计多入口收尾,说明取消信号与资源释放的边界。441 收藏 -
Go 读取包含 0x00 的二进制流时,不要把零字节当成文本结束符。本文解释 Scanner 的限制,并用 bufio.Reader 和 io.ReadFull 处理分隔帧、固定长度帧与 io.EOF。215 收藏 -
Go context.WithCancel 的父子关系是单向取消传播:父 context 取消会让子 context 和后代一起结束,子 context 取消不会影响父 context 或兄弟节点。本文用代码说明 Done、Err、cancel 和资源释放边界。100 收藏 -
自定义 bufio.Scanner 的 SplitFunc 时,最后一个字段没有分隔符很容易被漏掉。本文用逗号分词示例说明 atEOF 与剩余 data 的关系,并给出连续分隔符、空 token 和 ErrFinalToken 的处理边界。243 收藏 -
长任务不要把所有 cancel 都拖到最外层释放。本文用 Go context.WithCancel 说明阶段级上下文的创建、取消传播、并行 worker 退出和错误区分。287 收藏 -
Golang · Go教程 | 2星期前 | 错误处理 · bufio · Go教程 · Go bufio.Scanner Scanner.Buffer 超长行 MaxScanTokenSize ScanLines
Go bufio.Scanner 默认 token 上限约为 64 KiB,扫描日志、CSV 或协议长行时可能返回 token too long。本文解释 Scanner.Buffer 的初始容量与最大上限,比较 Scanner、Reader 和整体读取的选择边界。414 收藏 -
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 收藏