Go语言技术文章
-
ast.IsGenerated 依赖解析时保留的标准生成注释。通过解析模式、固定前后缀及标记位置的对照示例,说明返回 false 的常见原因与工具使用范围。457 收藏 -
用一个短时长 Go time.Timer 最小复现 Stop 后仍收到事件的现象,解释 Go 1.23 前后的通道语义差异,并给出不会误阻塞的兼容处理方式。471 收藏 -
Go bytes.Buffer.Grow 只预留后续写入容量,不会增加有效数据长度。本文区分 Grow、Len、Cap 和 Bytes,说明如何正确写入、读取、复用缓冲区并处理边界。110 收藏 -
Go time.DateOnly 代表 2006-01-02,可以同时用于 Time.Format 和 time.Parse,让日期字段统一输出与读取 YYYY-MM-DD。本文说明格式化、解析、错误处理、时区边界和日期类型封装。347 收藏 -
Go 的 encoding/json.Number 代表 JSON 数字原文,Int64 只适合能表示为 int64 的整数文本。本文区分小数、指数形式、越界和格式错误,并给出 UseNumber 与可复用解析函数。278 收藏 -
Go reflect.Value.Set 报错通常不是 Set 本身随机失败,而是目标 Value 不可设置、只拿到了值副本、字段未导出或类型不匹配。本文按 CanSet、指针解引用、字段导出和类型检查拆开定位,并给出返回 error 的安全封装。138 收藏 -
sync.Map 并不保证在所有并发读写场景都快于 map 加 RWMutex。本文从读写比例、键集合和更新竞争三个维度构造最小 benchmark,解释性能没有达到预期时如何定位并选择实现。307 收藏 -
Go mime.WordDecoder 遇到自定义字符集时会调用 CharsetReader。回调返回 nil,error 会把错误交给 DecodeHeader;返回 nil,nil 则违反必须提供 Reader 或 error 的契约,不能当作跳过转换。本文用最小回调解释失败原因、定位方法和修复方式。152 收藏 -
CommentMap.Update 只迁移注释关联,不替换 AST 父字段。通过完整 Go 示例说明写回节点、Filter 筛选以及浅复制和注释位置的适用范围。466 收藏 -
sync.Once 的 Do 只负责让初始化函数最多执行一次,初始化函数返回错误并不会自动恢复可重试状态。本文用最小复现说明第一次失败后第二次调用为何不再进入函数,并给出需要重试时的显式状态方案。195 收藏 -
runtime.Goexit 结束的是当前 goroutine,不会返回调用方,但已经登记的 defer 仍会执行;它不是 panic,recover 也无法捕获。本文说明 main goroutine 的特殊结果,并给出 return、error、context 和 channel 的替代选择。438 收藏 -
Go ast.File.Pos 指向 package 声明而非文件头。通过原始源码示例区分 FileStart、Doc 与字节偏移,并说明源码工具如何保留前导注释与空白。314 收藏 -
ast.File.GoVersion 不是 go.mod 的版本字段,而是从当前 Go 文件头的构建约束推导出的最低语言版本。本文拆开两条版本链路,并给出 AST 工具的读取方案。416 收藏 -
Go sync.Pool 只提供临时对象的复用机会,不承诺每次 Get 都拿回上一次 Put 的对象。本文从地址变化现象出发,解释自动清理的契约,构造最小复现,并给出清理对象、限制容量和选择替代结构的实用边界。408 收藏 -
Go database/sql 的 DB.Stats 会累计记录连接池等待次数和等待时长。本文说明 WaitDuration 的真实含义,如何用两个快照计算窗口增量,以及怎样把连接池排队和 SQL 执行慢分开判断。269 收藏