Go问答技术文章
-
Go range 中直接保存 &value,可能把循环变量副本的地址重复保存,导致多个指针看起来指向同一个对象。本文从切片、map、闭包和 Go 1.22 模块语义四个边界排查原因,并给出稳定的下标取址与独立副本写法。456 收藏 -
Go 的 time.Ticker.Reset 会从新时长重新安排下一次 tick,但慢接收者、未执行到 Reset 或并发修改都会让观察结果像是旧周期仍在生效。本文用最小示例拆开这些原因,并给出单一重置入口与日志复查方式。456 收藏 -
Go x/image/font/opentype 中 Size 是点值,DPI 是输出分辨率;两者共同决定 Face 的缩放比例。本文用源码关系、Metrics、GlyphBounds 和绘制坐标说明为什么字号不变时修改 DPI 会让字形变大,并给出参数选择策略。456 收藏 -
Go select 一旦包含 default,在没有可进行通信时就会立即执行。把它放进消费 for 循环会让循环持续重试,表现为 CPU 升高但没有有效消费。本文从故障症状、阻塞式修复、取消与关闭 channel 处理,到必须轮询时的退避边界,给出一套可直接套用的处理方式。456 收藏 -
go-pretty/table 的 RowPainter 接收整行并返回 text.Colors,适合按状态或排序位置统一着色。本文说明回调契约、SetRowPainter 的覆盖关系、RowPainterWithAttributes 的行号语义,以及空行和禁色场景的处理。456 收藏 -
解释 Go math/big.Int.SetBytes 的大端无符号语义,结合高位字节、负数编码与字节序转换示例,给出解析二进制整数时的检查边界。455 收藏 -
Go fuzz 测试发现失败输入后,会把最小化样例写入 testdata/fuzz/FuzzXxx。保留这个 corpus 文件,再用 go test -run 复现并纳入版本库,就能把随机发现的问题变成稳定回归用例。455 收藏 -
Go 的 time.Ticker 不是保存每次节拍的事件队列。本文解释接收方变慢时 tick 为什么会被丢弃,并给出按时间补偿、计数和可靠事件记录的选择方法。455 收藏 -
Go 规范明确规定 map 遍历顺序未指定,同一 map 的多次 range 也不保证一致。需要稳定输出时,应先收集键并排序,再按键读取值;测试则按目标选择 maps.Equal 或确定性序列化。455 收藏 -
WalkDir 的错误处理关键不在于一律忽略,而在于区分错误范围与结果完整性,再选择返回错误、继续遍历、跳过目录或停止全局遍历。455 收藏 -
Go 1.27 支持具体类型的泛型方法,但嵌入泛型类型后仍要按实例化类型、值/指针接收者和接口固定签名计算方法集。本文用结构体与接口示例拆解常见误判,并给出排查清单。455 收藏 -
使用 sync.WaitGroup 收尾并发任务时,关键不是把 Wait 放在最后,而是保证任务计数先建立、空 WaitGroup 上的 Go 先于 Wait,并在复用前等上一轮 Wait 返回。本文对比 WaitGroup.Go 与 Add/Done 的调用顺序,给出一份可直接落地的并发收尾写法。455 收藏 -
Go SQLX MapScan 适合读取列名不固定的查询结果。本文给出 Queryx、MapScan、Rows.Close 和 Rows.Err 的配合写法,并说明重复列名、NULL 值以及与 StructScan、SliceScan 的取舍。455 收藏 -
区分go-smtp服务端扩展声明、本地API与会话条件,解释Extension、SupportsAuth、TLS和SIZE判断,并给出不认证不投递的能力快照示例。455 收藏 -
Go 1.24 引入 runtime.AddCleanup 后,资源清理不必再把所有希望寄托在 SetFinalizer 上。本文从一个文件句柄包装器切入,解释 Cleanup.Stop、runtime.KeepAlive、回收时机和显式 Close 的边界,并给出可回归的迁移检查。454 收藏