Go问答技术文章
-
Go 1.26 让 new 函数可以直接接收表达式,适合构造 JSON 可选字段和配置指针。本文从旧写法、版本门槛、兼容回退和最小验证说明哪些代码值得改、哪些不该急着改。226 收藏 -
Golang · Go问答 | 21小时前 | 错误处理 · go · 性能 · bytes.Buffer · Go 1.26 · io.EOF 版本迁移 Go 1.26 bytes.Buffer.Peek 缓冲区预览
Go 1.26 为 bytes.Buffer 增加 Peek 方法,可以在不推进读取位置的前提下预览前 N 个字节。本文对比 Next 和 Peek 的行为,说明 io.EOF、切片有效期、旧工具链兼容与测试边界。428 收藏 -
Go 1.21 之后,工具链版本不只由机器上的 go 决定。用 go.mod、GOTOOLCHAIN 和 CI 矩阵配合,能把自动升级、固定版本和失败回退边界讲清楚。488 收藏 -
Go 的 json.Unmarshal 默认会忽略结构体中不存在的字段。本文用 Decoder.DisallowUnknownFields 给 HTTP JSON 接口加上字段契约,并说明兼容升级、错误定位和生产边界。160 收藏 -
Go 1.21 带来的 log/slog 不只是把日志改成 JSON。本文从一次请求日志难以检索的场景出发,解释结构化字段、Handler、级别过滤和高频日志的取舍,并给出一套可渐进迁移的检查方法。158 收藏 -
Golang · Go问答 | 1天前 | golang · 连接池 · database/sql · Go问答 · 数据库事务 · 连接池 事务 DBStats rows.Close Go database/sql
Go database/sql 里漏掉 Rows.Close,问题往往不是某一次查询报错,而是连接长期被结果集占着,最终让连接池等待堆积。本文从 DBStats 指标和事务生命周期入手,复现现象,解释 Rows、Tx 与连接归还的关系,并给出可复查的代码边界。374 收藏 -
Go 服务把 regexp.Compile 放进请求路径后,p99 往往先于 CPU 告警变差。本文用一组可复现的基线对比,说明预编译、有限缓存和输入边界各自解决什么问题,并给出可验收的 benchmark 方法。271 收藏 -
Golang · Go问答 | 1天前 | golang · 错误处理 · 泛型 · Go问答 · Go 1.26 · errors.As Go问答 Go 1.26 errors.AsType 泛型错误处理
Go 1.26 为 errors 包增加了泛型函数 AsType,让调用方可以直接拿到指定错误类型,减少 errors.As 的目标变量和类型断言。本文从订单校验错误的实际场景出发,对比新旧写法、兼容边界和测试验收方式。255 收藏 -
Webhook 只校验 HMAC 签名还不够,攻击者仍可能重放一条合法请求。本文用时间戳限制有效窗口,用 nonce 做短期去重,并明确原始请求体、密钥轮换、幂等写入和审计日志的边界,给出 Go 服务可以落地的验签流程。187 收藏 -
Go 回调接口是否都应该返回 error?从同步确认、异步投递和后台任务三个场景拆解接口设计,给出可落地的签名、错误归属和判断清单。382 收藏 -
Go 的 encoding/json 使用 omitzero 处理零值字段。本文用 time.Time、空切片和自定义 IsZero 场景,对比 omitempty 的判断并给出接口调整后的验收方法。158 收藏 -
线上接口偶发慢几百毫秒,等问题出现后再启动完整 trace 往往已经晚了。Go 1.25 的 runtime/trace.FlightRecorder 会把最近一段运行轨迹保存在内存环形缓冲区,异常触发时再导出,本文说明 MinAge、MaxBytes、Start、WriteTo 的最小用法和生产边界。279 收藏 -
Go 测试里 t.Setenv 会通过 Cleanup 恢复进程环境,但环境变量属于整个进程,不能与 t.Parallel 或并行父测试混用。本文用一个小型配置测试项目拆开这个限制,给出串行隔离、参数注入和子测试分组的选择边界。325 收藏 -
Go 1.24 引入 encoding.TextAppender 和 BinaryAppender。本文从日志缓冲区场景出发,验证 AppendText 的追加语义、错误回退和分配边界。141 收藏 -
sync.Cond 的难点不是调用 Broadcast,而是让共享状态、锁和等待条件保持同一条时间线。本文用一个任务队列场景拆解 Wait、Signal、Broadcast 的正确顺序、常见误区与可验证写法。410 收藏