Go问答技术文章
-
Go slices.BinarySearch 返回的索引即使找不到元素也有意义:先保证切片有序,再用 found 判断命中,并把索引作为插入位置或下界使用。194 收藏 -
time.ParseDuration 能解析带单位的时长,但 Duration 本质是 int64 纳秒数。本文从配置输入、解析错误和范围校验三个环节说明如何避免极大值溢出,并给出安全回退写法。194 收藏 -
Go 1.21 引入的 log/slog 让结构化日志更容易落地,但字段从 slog.Any 到 Handler 再到 JSON 输出时,组、动态值和敏感字段仍有边界。本文用订单请求日志拆解字段流转、Handler 包装与脱敏验证。193 收藏 -
Go 泛型代码里,值类型约束明明包含目标类型,却可能无法调用指针接收者方法。本文用类型集、方法集和可运行示例拆开这个边界,并给出约束与调用方都能验收的写法。193 收藏 -
Golang · Go问答 | 1天前 | 标准库 · Go问答 · encoding/json · JSON解析 · Go encoding/json 流式解析 Decoder.Token json.Delim
面对字段层级不固定、又不适合一次性读入内存的 JSON,Go 的 encoding/json.Decoder.Token 可以逐个读取语法令牌。本文用对象中嵌套数组的例子说明流式游标、json.Delim、dec.More 与提前结束时的错误边界。193 收藏 -
Golang · Go问答 | 5天前 | 并发 · 错误处理 · Context · Go问答 · 服务排查 · Go 错误日志 超时 context.WithCancelCause context.Cause 取消原因
只记录 context.Err() 时,Go 服务通常只能看到 context canceled 或 deadline exceeded,无法判断是上游主动取消、下游超时还是业务熔断。本文用 context.WithCancelCause 和 context.Cause 传递可诊断的取消原因,并说明父子 Context、超时边界与日志落点。191 收藏 -
Webhook 只校验 HMAC 签名还不够,攻击者仍可能重放一条合法请求。本文用时间戳限制有效窗口,用 nonce 做短期去重,并明确原始请求体、密钥轮换、幂等写入和审计日志的边界,给出 Go 服务可以落地的验签流程。187 收藏 -
Go 的 slices.Collect 能把 iter.Seq 惰性序列一次收成切片。本文用分页数据和空输入例子说明 iter.Seq、slices.Collect、append 之间的关系,以及无法预估长度时的容量取舍。187 收藏 -
用同一份 PNG 输入验证 image/png.DecodeConfig 的尺寸读取、Reader 消费位置和 Decode 配合方式,解释 bytes.Reader、Seek 与不可回退流之间的边界。185 收藏 -
Go 客户端明明复用了同一个 http.Transport,却不断新建 TCP 连接,常见原因不是连接池失效,而是响应体没有读完并关闭、每个请求重复创建 Transport,或空闲连接参数与并发量不匹配。本文用可观察的请求流程拆开判断方法。184 收藏 -
reflect.TypeFor[T]() 从 Go 1.22 开始直接返回泛型类型 T 对应的 reflect.Type。本文对比旧的 reflect.TypeOf((*T)(nil)).Elem(),说明接口类型、指针类型、类型缓存和 Go 版本兼容边界,给出可运行的类型判断示例。184 收藏 -
一次 Go 流式上传在异常路径卡死的排查记录:用 io.Pipe、CloseWithError 和 goroutine 栈定位背压与退出顺序问题,再补上可验证的清理和超时边界。182 收藏 -
Go 循环里反复调用 time.After 不一定立刻造成传统意义上的永久泄漏,但在高频循环里会让还没触发的定时器短时间堆积,内存和定时器队列压力都会上来。本文从现象排查到修复写法,讲清什么时候可以用 time.After,什么时候应该改成 time.NewTimer 并配合 Stop 和 Reset。181 收藏 -
解释 Go 测试中 testing.TB.Cleanup 的执行时机,结合主测试、t.Run 子测试和并行测试,定位清理函数看似没有执行的常见原因。181 收藏 -
Go 的 net/http Cookie 同时设置 Expires 与 MaxAge 时,浏览器如何判断会话、持久化和删除?本文用 SetCookie 与 Request.Cookie 的最小例子拆开三个边界。181 收藏