Go语言技术文章
-
io.NewOffsetWriter 可以把顺序写入映射到一个带起始偏移的区域,但它不会替底层 WriterAt 修复短写,也不会把 Seek 的定位语义变成并发安全。本文用可复现的内存示例拆开偏移、短写和错误传播边界。369 收藏 -
Go embed.FS 会把匹配到的目录作为一棵只读文件树交给程序。本文用 io/fs.Sub 切出指定子目录,让 HTTP 静态文件和模板只看到自己的资源根,并说明路径、错误和测试边界。369 收藏 -
Go 项目有 vendor 目录并不代表所有命令都会自动使用它。本文按 go.mod 的 go 版本、vendor/modules.txt、-mod 参数和 GOFLAGS 拆解判断条件,并给出 CI 中排查依赖来源的检查清单。369 收藏 -
讲清 Go template.ParseFS 如何按 embed.FS 的正斜杠路径使用通配符,说明多级模板目录的组织、** 误区与 ExecuteTemplate 的稳定入口写法。369 收藏 -
Go os.File.Sync 成功后仍然需要 Close。本文区分持久化与释放句柄的职责,说明缓冲写入先 Flush、关键文件正确处理 Close 错误,以及替换文件时的收尾顺序。369 收藏 -
Go json.RawMessage 通过标准库解码时会复制输入,但手动切片转换仍可能共享底层字节;本文说明如何在延迟解析、队列和并发边界前建立独立所有权。369 收藏 -
用 Go encoding/json 的 json.RawMessage 先读取联合字段判别值,再将 payload 延迟解析到具体结构体,并区分未知类型、null、格式错误和字段类型错误。369 收藏 -
Go 的 database/sql Conn.Raw 只能在回调期间访问底层驱动连接。本文说明如何取得专用 Conn、判断驱动能力、处理 driver.ErrBadConn,并解释为什么不能把 driverConn 保存到回调之外。369 收藏 -
Go接口只有动态类型和动态值都未设置时才等于nil。本文用一个小型错误处理示例拆解nil指针装入接口后的判断差异,并给出error返回、类型断言、reflect检查和测试验收方法。369 收藏 -
Go 1.25 继续完善 runtime.AddCleanup 的并发清理能力。本文从文件描述符这类外部资源出发,说明它与 SetFinalizer 的语义差异、必须保留的显式 Close,以及 GODEBUG 检查方式。368 收藏 -
bytes.Buffer.Bytes 返回的是仍由缓冲区管理的切片视图,不是独立副本。本文通过复用、写入和复制三个场景,说明如何判断别名风险,以及什么时候该用 bytes.Clone 或 append(nil, b.Bytes()...) 保留稳定数据。368 收藏 -
用 log/slog 的 Enabled 判断和 LogAttrs 组织一次可验证的小实验,说明低级别日志何时被丢弃、昂贵属性何时仍会提前计算,以及 HandlerOptions.Level 与 LevelVar 的边界。368 收藏 -
Go 的 unicode/utf8.RuneStart 只能判断字节是否可能位于一个 UTF-8 字符的起点,不能单独完成合法性校验。本文用切片扫描、DecodeRune 和 Valid 的组合处理截断与非法序列。368 收藏 -
Go 1.27 的 go fix 新增 unsafefuncs modernizer,可把特定的 unsafe.Pointer 与 uintptr 算术改写为 unsafe.Add。本文用最小代码说明改写对象、版本门槛和人工复核边界。368 收藏 -
Go benchmark 结果忽高忽低,常见原因不是被测函数本身,而是初始化落在计时区间、分配统计未分开或运行噪声未被重复确认。本文用 testing.B 说明 StopTimer、ResetTimer、ReportAllocs 和 -count 的配合方式。368 收藏