Go语言技术文章
-
Go 的 time.After 每调用一次都会得到一个新的定时器通道。循环中高频调用会增加定时器和分配开销,但 Go 1.23 起不再引用的未停止定时器可以被回收;需要反复等待时应改用可复用的 time.Timer。345 收藏 -
Golang · Go问答 | 2星期前 | 并发 · channel · goroutine · Go问答 · Go channel 关闭 channel 接收零值 双值接收 range channel
Go channel 关闭后,接收操作会在没有更多数据时返回元素类型的零值。要区分真实业务零值与关闭信号,应使用双值接收的 ok 标志,或用 range 消费到结束;本文同时说明缓冲区残留、关闭责任和重复 close 的常见边界。345 收藏 -
解释 Go runtime/cgo.Handle 删除后的有效性边界:C 端继续回传旧句柄时,Go 侧 Value 会触发 panic,并给出回调停止、所有权交接和重复释放的处理方式。345 收藏 -
用 Go 1.23 的 maps.DeleteFunc 批量清空 map,理解保留容器、别名可见性、nil map、容量与并发访问之间的边界。345 收藏 -
Go 的 FlagSet 能为每个子命令建立独立参数空间。本文通过 ContinueOnError、纯解析函数和表驱动测试,讲清命令分派、错误输出与业务执行如何解耦。345 收藏 -
Go 代码用 slices.Delete 移除大对象后,进程内存为何仍然居高不下?本文从底层数组、切片尾部引用和长生命周期缓存三个角度解释原因,并给出可验证的清零与缩容方案。344 收藏 -
context.WithoutCancel 会保留父 Context 的 Value,但故意切断 Done、Err、Deadline 和 Cause。本文用 Go 1.21+ 的最小示例说明适用场景、迁移边界与验收方法。344 收藏 -
接口收到一段无法解析的 JSON 时,json.Decoder.InputOffset 可以提供稳定的字节位置。本文用一个请求体校验器串起 Decode、InputOffset、错误截取和边界保护。344 收藏 -
sync.Map.Range 适合遍历某个时刻可见的键值,但不能把回调结果当成并发集合的稳定快照。本文拆开 Store、Delete 与 Range 同时发生时的可见性边界,并给出需要一致结果时的替代方案。344 收藏 -
Go 分数运算使用 math/big.Rat 保留任意精度的分子和分母,结合 SetString、Add、Mul、Quo 与 Cmp 完成精确计算,最后再用 FloatString 输出小数。344 收藏 -
用 Go text/template 的命名模板和 ExecuteTemplate,让同一个 Report 数据对象输出纯文本与 Markdown,并说明 define、Parse、字段路径和 html/template 的边界。344 收藏 -
Go url.JoinPath 会自动清理路径中的多余斜杠,但 https:// 的双斜杠是协议分隔符。本文从路径拆分、PathEscape 和 EscapedPath 三个角度排查异常拼接。344 收藏 -
用 Go maps.EqualFunc 比较带 float64 字段的 map,拆清键集合、结构体值、绝对与相对误差、NaN 和无穷大的处理边界。344 收藏 -
Go 的 io.Copy 会流式复制大文件,并优先使用 WriterTo 或 ReaderFrom;覆盖旧文件时仍要显式截断。本文给出 O_TRUNC 最小写法,以及用 CopyN、临时文件、Sync 和 Rename 处理提前 EOF 与失败回滚的实现。344 收藏 -
讲清 Go pem.Decode 的 block/rest 返回关系,给出连续读取多个 PEM 区块的循环、nil 退出边界和按 Type 分流解析的方法。344 收藏