Go问答技术文章
-
http.Server.BaseContext 的字段为 nil 与回调返回 nil 不是一回事:前者使用 context.Background,后者会在服务器开始接收连接前触发 panic。本文按启动时间线拆开这个边界,给出非空 Context 修复写法和回归测试。322 收藏 -
context.WithTimeout 超时后,子协程仍在运行通常不是超时失效,而是 goroutine 没有监听 ctx.Done(),或卡在无法取消的阻塞调用中。本文用最小复现区分取消信号和强制终止,再给出可退出、可清理的 select 写法。159 收藏 -
Go pprof.Lookup 返回 nil 时,优先检查 Profile 是否注册、名称是否逐字一致以及查找时机是否早于初始化。本文给出自定义 Profile 的注册、诊断和导出方法。378 收藏 -
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 收藏