Go语言技术文章
-
用 Go 的 base64.NewEncoder 流式编码时,Write 只处理完整 3 字节块,尾部数据要靠 Close 刷出;本文结合源码说明部分写入和错误传播的判断方法。174 收藏 -
Go 的 url.URL.JoinPath 会合并路径、清理 ./ 和 ../,并把连续斜杠压成一个。它适合拼接已经转义的路径片段,但不能替代路径段转义;本文用源码规则解释斜杠变化和路由边界。486 收藏 -
Go 1.23 引入的 slices.Values 可以把切片包装成 iter.Seq。本文从实现、空切片和提前停止三个边界出发,说明它与普通 range、slices.Collect 的连接方式。201 收藏 -
Go 1.26 允许 new(expr) 直接从表达式推断指针类型。本文用切片和映射对比旧写法,说明零值、可写性、类型推断和迁移检查边界。366 收藏 -
解释 Go net.IP.Equal 如何处理 4 字节 IPv4 与 IPv4-mapped IPv6,结合 To4 和 16 字节表示说明比较、规范化与边界判断。477 收藏 -
time.Time 的 Equal 比较时间点,== 还会比较 Location 和单调时钟读数。本文用可运行示例拆开两者的边界,并说明 Round(0)、UTC 与序列化后的差异。458 收藏 -
Go 1.23 的 maps.Keys 返回 iter.Seq,遍历顺序仍不保证稳定。本文从 for range 与 maps.Keys 的关系出发,演示如何用 slices.Sorted 得到可复现的键序列,并说明排序成本与兼容边界。251 收藏 -
解释 Go strings.Builder.Grow 的保证范围、容量与已写入字节的关系,以及 String 返回值和后续写入之间容易误判的边界。243 收藏 -
从 io.Copy 的接口选择入手,拆解 os.File.ReadFrom 如何走 ReaderFrom 快路径,以及短读、EOF 和部分写入时该怎样验证。289 收藏 -
sync.Map 的 Range 适合遍历当前可见条目,却不提供并发快照。本文用 Store、Delete 与 Range 的交错过程拆开这个边界,并给出需要一致视图时的替代写法。308 收藏 -
json.RawMessage 适合把 JSON 解码延后,但 MarshalJSON 与 UnmarshalJSON 的字节所有权规则不同。本文用最小代码说明何时会复制、何时只是复用已有字节,以及如何避免修改底层切片带来的隐蔽问题。143 收藏 -
Go 1.26 的实验包 runtime/secret 用 secret.Do 包住处理敏感数据的调用链,清理寄存器和栈上的临时值,并在堆对象失去引用后交给垃圾回收清理。本文说明启用方式、返回值复制、panic 与平台限制。340 收藏 -
解释 bytes.Buffer 的 Available、Len、Cap 与 Grow 如何配合,给出可验证的追加空间判断,以及 AvailableBuffer 的使用边界。365 收藏 -
runtime.KeepAlive 的作用不是阻止 GC,而是把对象的可达性延长到指定调用点。本文用外部资源句柄的最小例子说明终结器为什么可能过早运行、KeepAlive 应该放在哪里,以及如何用资源关闭状态验证调用顺序。353 收藏 -
Go 服务收到 SIGINT 或 SIGTERM 后,不能只依赖进程直接退出。本文拆解 os/signal.NotifyContext 如何把信号转成 context.Done,说明 stop 的资源释放、取消传播和优雅退出的验收边界。374 收藏