Go问答技术文章
-
一次 Go 流式上传在异常路径卡死的排查记录:用 io.Pipe、CloseWithError 和 goroutine 栈定位背压与退出顺序问题,再补上可验证的清理和超时边界。182 收藏 -
用 sync.Pool 复用 bytes.Buffer 可以减少短生命周期对象的分配,但必须处理 Reset、取出类型和跨请求数据污染问题。本文从一次响应体串数据的故障现场出发,给出可验证的实现、边界和复查方式。173 收藏 -
Golang · Go问答 | 6天前 | 随机数 · Go问答 · 安全编程 · crypto/rand · math/rand · 验证码 安全 随机数 Go crypto/rand math/rand
Go 里 crypto/rand 和 math/rand 都能生成随机值,但用途完全不同。本文用验证码、抽样和测试数据三个场景拆开安全资产、攻击路径、并发控制与验证方法,给出不容易选错的边界。163 收藏 -
Golang · Go问答 | 6天前 | HTTP · 流式处理 · Go问答 · encoding/json · 请求体 · Go DECODE eof 流式解析 json.Decoder JSON请求体
Go 用 json.Decoder 读取 HTTP 请求体时,第二次 Decode 得到 EOF 不一定是异常:它可能代表输入已正常读完,也可能是把单个 JSON 请求误当成了连续流。本文从单对象、尾随空白和多值 JSON 三种边界出发,给出最小判断、严格校验与可复查的读取流程。160 收藏 -
Go 的 json.Unmarshal 默认会忽略结构体中不存在的字段。本文用 Decoder.DisallowUnknownFields 给 HTTP JSON 接口加上字段契约,并说明兼容升级、错误定位和生产边界。160 收藏 -
Go 的 encoding/json 使用 omitzero 处理零值字段。本文用 time.Time、空切片和自定义 IsZero 场景,对比 omitempty 的判断并给出接口调整后的验收方法。158 收藏 -
Go 1.21 带来的 log/slog 不只是把日志改成 JSON。本文从一次请求日志难以检索的场景出发,解释结构化字段、Handler、级别过滤和高频日志的取舍,并给出一套可渐进迁移的检查方法。158 收藏 -
Golang · Go问答 | 3星期前 | 依赖注入 · 设计模式 · api设计 · Go问答 · Functional Options · API设计 默认值 依赖注入 Go问答 Functional Options 函数选项
Go 的 Functional Options 能让构造函数同时保留合理默认值和可读的可选配置,但它不适合掩盖必填依赖。本文用一个 HTTP Client 组件说明 Option 的最小写法、默认值与必填项的边界、常见反例和测试清单。153 收藏 -
用 Go 的 embed.FS 把 Markdown 和静态资源打进单个二进制,再通过 net/http 提供本地预览,覆盖目录组织、路径处理、缓存和构建验收。153 收藏 -
Go 服务收到 SIGTERM 后,ListenAndServe 已经返回但进程仍迟迟不退出,通常不是 Shutdown 失效,而是活跃连接、长请求、HTTP/2 或 hijack 连接没有走完各自的收尾路径。本文用 ConnState、Shutdown 超时和 RegisterOnShutdown 拆开判断顺序,并给出可回归的优雅退出实现。150 收藏 -
Go 里 errors.Is 返回 false,很多时候不是目标错误不对,而是错误链在中间被格式化字符串截断了。本文从一个可复现的订单查询示例出发,比较 %v、%w 和自定义错误的行为,再给出 errors.Is、errors.As 的检查边界与测试写法。148 收藏 -
Go 1.23 为 for range 增加了函数迭代器。本文从旧版自定义遍历写法迁移到 iter.Seq,说明 yield 返回值、提前停止、iter.Pull 和 go.mod 版本边界,并给出可运行的检查代码。148 收藏 -
Golang · Go问答 | 6天前 | 工具链 · go语言 · Go教程 · 版本升级 · 代码重构 · Go 1.26 go fix modernizer 代码升级 new 表达式 Go 代码迁移
Go 1.26 重写了 go fix,把它从旧式修复命令变成基于 go/analysis 的 modernizer 工具。本文用一个含有可选字段和自定义 newInt 函数的 Go 模块,演示如何预览建议、限定改动范围、检查 go.mod 版本并完成回归。147 收藏 -
Golang · Go问答 | 4星期前 | golang · 消息队列 · 性能优化 · websocket · 高并发 · Go WebSocket广播 Go慢客户端 WebSocket发送队列 Go Hub分片 WebSocket背压
Go WebSocket 广播卡顿,常常不是 CPU 不够,而是一条慢连接把广播路径堵住了。本文从一个房间广播现场出发,说明为什么要给每个客户端独立发送队列、如何确定队列满时的业务策略,以及何时需要按房间分片 Hub,并给出可观测的检查项。146 收藏 -
Golang · Go问答 | 4天前 | 并发 · time · 定时任务 · Timer · Ticker · Go问答 · 定时器 Go 定时任务 停止 time.Ticker time.After time.NewTimer
Go 里一次性超时、可重置等待和周期任务分别适合 time.After、time.NewTimer 与 time.Ticker。本文用三个小场景对比它们的触发语义、停止方式、慢任务边界和 Go 1.23 定时器变化,给出可直接复用的选择规则。144 收藏