Go语言技术文章
-
Go 1.22 改变了 range 循环变量的作用域。本文用 goroutine 闭包示例说明旧写法为何会读到同一个值、go.mod 如何决定语义,以及升级后怎样验证和清理多余代码。391 收藏 -
netip.ParseAddr 返回的 netip.Addr 是值类型,可以用 Compare 做排序和相等判断,但 IPv6 Zone、非法输入和零值仍要单独处理。本文用可运行示例拆开这些边界。133 收藏 -
os.CreateTemp 返回的是已经打开的临时文件,真正容易遗漏的是关闭文件描述符和删除失败残留。本文用一个安全写入配置文件的例子,拆开 Name、Close、Remove 与 Rename 的先后关系,并给出可复查的失败清理路径。324 收藏 -
用 Go runtime.SetFinalizer 说明终结器的触发条件、KeepAlive 的必要性、显式 Close 与终结器兜底的边界,并给出可运行的资源生命周期示例。348 收藏 -
crypto/rand.Read 的签名虽然返回 n 和 err,但当前 Go 文档规定它会填满切片且不返回错误。本文从 Reader、io.ReadFull 和失败测试边界解释为什么不能把部分字节当成可用随机值。461 收藏 -
解释 Go net/http 中 ResponseController.EnableFullDuplex 的适用边界,给出 HTTP/1 请求体与响应交错处理的最小示例、协议判断和中间件兼容检查。232 收藏 -
Go 解析流式 JSON 时遇到 SyntaxError,Decoder.InputOffset 能告诉你解码器已经读到哪个字节,但它不是行号也不是错误字符的万能定位器。本文用带换行的请求体演示如何结合错误信息、原始字节和 Decode 循环缩小排查范围。429 收藏 -
atomic.Uint64 适合维护并发计数,但一个已经使用过的值不能再通过复制传递。本文用请求计数器拆开 Add、Load、Store 和复制副本的边界,说明为什么会触发 go vet 警告,以及如何安全地初始化、读取和测试。379 收藏 -
用 Go 的 io/fs.Sub 把嵌入文件系统收窄到一个子目录时,真正容易出错的是目录名和 Open 路径的边界。本文通过 embed.FS 示例拆开 fs.Sub、fs.ValidPath 与 fs.PathError 的关系,并给出可复现的排查方法。142 收藏 -
Go 里用 sort.Slice 和 sort.SliceStable 排序时,真正容易忽略的是相等元素的顺序与 less 比较函数约束。本文用一组带优先级和序号的记录,演示两者差异、稳定排序的适用边界和可复查写法。142 收藏 -
Go slog 在多个子系统共用 id、status 等字段时,WithGroup 可以把属性放进稳定命名空间。本文用 TextHandler 和 JSONHandler 对比分组结果,并说明动态属性、嵌套分组与空组名的边界。387 收藏 -
Go embed.FS 把配置目录编译进程序后,可以用 fs.WalkDir 按路径筛选 YAML 文件并保留遍历错误。本文从嵌入文件树开始,演示目录遍历、扩展名过滤、错误返回和测试检查。431 收藏 -
Go 的 http.Transport.Clone 会复制 Transport 配置,但 TLSClientConfig 也有自己的复制边界。本文用一个双客户端场景说明修改克隆对象是否影响原对象,以及并发使用 Transport 时应避开的写法。492 收藏 -
Go encoding/csv 的 FieldsPerRecord 决定每行字段数如何校验:正数固定列数、0 以首行定标、负数允许变化。本文用订单导入场景演示三种模式、错误定位与按行兼容策略。326 收藏 -
bytes.Clone 返回独立的 []byte 副本,适合把复用缓冲区中的数据保存成安全快照。本文用可复现代码说明 append、切片别名和 bytes.Clone 的差异,并给出基线与边界。202 收藏