Go问答技术文章
-
浏览器会在请求中带上 Sec-Fetch-Site 等 Fetch Metadata。用一层 Go 中间件先区分 same-origin、cross-site 和缺失请求头,再与 CSRF、Origin 校验配合,可以为敏感接口补上一道跨站访问边界。349 收藏 -
Go 1.24 新增的 os.Root 可以把文件操作限制在指定目录内,减少路径拼接带来的越界风险。本文用一个导入任务目录演示 Open、Join、Mkdir 和遍历文件的安全边界,并用回归测试核对绝对路径、.. 路径和符号链接场景。340 收藏 -
Go 处理大文件上传时,不要直接把请求体读进内存。本文用临时文件串起流式写入、大小校验、SHA-256 校验和原子替换,说明每一步为什么存在,以及失败时怎样清理。335 收藏 -
Go 从 channel 接收时,关闭后的读取会立刻返回元素类型的零值。本文用订单事件场景说明如何用第二个返回值 ok 区分真实数据、关闭信号与业务结束条件,并给出可复查的写法。333 收藏 -
Go 测试里 t.Setenv 会通过 Cleanup 恢复进程环境,但环境变量属于整个进程,不能与 t.Parallel 或并行父测试混用。本文用一个小型配置测试项目拆开这个限制,给出串行隔离、参数注入和子测试分组的选择边界。325 收藏 -
Go 1.26 放宽了内置 new 的参数限制,new(表达式) 可以直接创建带初始值的指针。本文用 JSON 可选字段和泛型示例说明它解决了什么问题、旧代码是否需要迁移,以及升级后如何验证兼容性。318 收藏 -
Go 1.21 之后,go 命令会根据 go.mod 的 go、toolchain 指令选择工具链。本文用一个 CI 版本漂移场景,拆开自动切换的依据、GOTOOLCHAIN 的三种边界,以及如何保留本地便利和线上可复现。316 收藏 -
Golang · Go问答 | 1天前 | 并发 · 故障排查 · Go问答 · encoding/json · 配置中心 · sync/atomic · encoding/json atomic.Value Go配置热加载 Decoder 配置复用 旧值残留
Go 服务热加载 JSON 配置时,偶发读到旧值通常不是文件没有更新,而是解码目标被复用、缺失字段没有覆盖旧内容,或读写过程没有通过不可变快照切换。本文从一次线上故障切入,给出可复现证据、修复代码和回归检查。311 收藏 -
Golang · Go问答 | 2星期前 | 超时 · 错误处理 · go · Context · errors.Is Go context deadline exceeded WithCancelCause
Go 服务里看到 context deadline exceeded,不代表所有请求都只是超时。本文从上游主动取消、下游调用超时和本地截止时间三种现场出发,演示 WithCancelCause、Cause 与 errors.Is 的判断顺序,让日志能指出真正的中断来源。309 收藏 -
Golang · Go问答 | 3星期前 | GC · sync.Pool · bytes.Buffer · 内存优化 · Go问答 · Go 垃圾回收 内存占用 对象池 sync.Pool bytes.Buffer buffer复用
Go 服务用 sync.Pool 复用 bytes.Buffer 后,流量回落时 RSS 仍高并不一定是泄漏。本文从大容量底层数组被放回池、GC 回收节奏和运行时向系统归还内存三个层面复现问题,给出容量上限与 pprof 验证方法。307 收藏 -
Golang · Go问答 | 3星期前 | goroutine · Context · Go问答 · 排查清单 · 服务超时 · goroutine泄漏 context.WithTimeout Go问答 CancelFunc Go context取消 Go服务超时
Go 服务已经返回超时,但后台 goroutine 仍在消耗连接和内存,往往不是超时参数太小,而是取消信号没有沿调用链传递或 CancelFunc 没有及时调用。本文给出从症状判断、代码修复到告警复盘的排查清单。304 收藏 -
Golang · Go问答 | 3星期前 | interface · 测试 · 架构设计 · Go问答 · 代码评审 · Go 接口设计 接口定义位置 Go mock accept interfaces return structs Go 架构
Go 接口通常应放在使用方包里,而不是实现方为了 mock 提前导出一大组接口。本文通过调用方依赖、真实测试与多实现边界,说明什么时候该定义小接口,什么时候直接返回具体类型更清晰。300 收藏 -
Golang · Go问答 | 3星期前 | 并发 · 性能优化 · sync.Pool · bytes.Buffer · Go问答 · reset bytes.Buffer 对象复用 Go sync.Pool 数据串行
sync.Pool 复用 bytes.Buffer 时,旧内容残留和过早归还都会让响应出现串数据。本文从现象、最小复现到 Reset 与归还时机,给出可直接用于编码响应的安全写法。294 收藏 -
支付渠道一多,业务代码很容易被供应商 SDK 和字段差异拖住。本文用 Go 拆出支付端口、渠道适配器和业务用例,演示如何保持核心接口稳定,并处理超时、重复回调和渠道错误映射。293 收藏 -
Golang · Go问答 | 2星期前 | 错误处理 · go · SQL · database/sql · 线上排查 · SCAN 查询结果 database/sql Go问答 rows.Next Rows.Err
Go 读取数据库结果时,rows.Next 返回 false 只能说明当前结果集没有下一行,不能直接当成查询成功。需要在循环后检查 rows.Err,并分别处理 QueryContext、Scan、Close 的错误,才能区分正常查完、数据库中断和结果读取失败。292 收藏