Go问答技术文章
-
Go 1.27 永久移除 asynctimerchan,time 包定时器通道始终使用同步语义。本文从版本、配置、cap/len 和 Stop/Reset 回归四个边界,给出旧行为排查方法。385 收藏 -
slices.Compact 只会合并连续重复元素,不是全局去重函数。本文用 Go 示例说明如何识别顺序边界、何时先排序,以及如何使用 CompactFunc。385 收藏 -
Go 中同名包不代表同一个导入目标。本文用 go list 对照 ImportPath、Dir 和 Name,说明如何核对 go.mod 模块路径、internal 父目录与调用方边界,并定位真实加载错误。385 收藏 -
Go 使用 database/sql.Rows 时,连接数持续升高往往与结果集未关闭、迭代错误未检查或事务未结束有关。本文用 Rows 生命周期、DB.Stats 和退出路径清单定位并修复连接泄漏。385 收藏 -
Go 的 json.Decoder 在空输入或读取完流后会返回 io.EOF。本文用计数器和错误分类区分正常结束、空响应、截断 JSON 与语法错误,给出可直接改造的处理代码。385 收藏 -
ring.New(0) 返回 nil 不是初始化失败,而是 container/ring 对空环的明确表示。本文结合官方源码区分 nil 空环与 Ring 零值,说明 n<=0 的处理、可安全调用的方法及两种工程修复方式。385 收藏 -
Go 对字符串执行 for range 时,如果遇到非法 UTF-8,第二个迭代值会是 U+FFFD(utf8.RuneError),下一轮只前进一个字节。本文解释字节索引、连续非法序列、合法 U+FFFD 的歧义,以及 ValidString 和 DecodeRuneInString 的正确用法。385 收藏 -
Go expvar.Map 可以把按接口、缓存或队列维度拆分的统计值组织成一个指标映射,再用 Publish 注册到 expvar 全局变量表。本文说明 Add、Set、Get、Delete 与 Publish 的职责边界,以及并发更新和键名设计要点。385 收藏 -
Go race 报告标出 Read by goroutine 时,不要只盯着读函数。本文用一段最小复现说明如何沿 Previous write 栈找到真正写入点,再把互斥锁、通道或原子操作补在共享状态边界。385 收藏 -
用 Go flag.NewFlagSet 和 ContinueOnError 接管参数错误,区分缺失参数、未知参数与 -h,统一输出 Usage 和退出码。384 收藏 -
Go 基准测试开启内存分配报告后,结果变化不一定代表业务代码变慢。本文从计时边界、b.ReportAllocs、B/op、allocs/op 和重复运行入手,区分真实分配与测量噪声。384 收藏 -
Go select 发送到满 channel 时,default 只能让本次发送立即返回,不能代替重试和关闭协议。本文用有界事件队列说明如何选择立即丢弃、有限退避或带超时阻塞,并给出指标与验收清单。384 收藏 -
Go 测试中不要直接清空或复制已使用的 sync.Once。本文解释初始化、panic、并发和复制边界,并给出用实例工厂实现测试隔离的写法。384 收藏 -
用 Go 泛型写切片函数时,S ~[]E 可以兼容原始切片、类型别名和底层类型相同的自定义切片。本文用一个保留返回类型的示例讲清约束、推导和边界。384 收藏 -
解释 Go SectionReader.ReadAt 为什么会同时返回有效数据和 io.EOF,拆解区间边界、偏移换算与 ReaderAt 契约,并给出避免丢失尾部字节的正确判断顺序。384 收藏