Go问答技术文章
-
用两个最小复现解释 Go slice 的 append 行为:当 cap 够用时会复用底层数组,原 slice 可能被间接改动;当 cap 不够时会分配新数组,后续修改互不影响。236 收藏 -
Golang · Go问答 | 18小时前 | 标准库 · bufio · 网络协议 · Go问答 · 流式读取 · peek Go bufio.Reader 协议解析 Go问答 Discard UnreadByte
Go 用 bufio.Reader 解析带长度或分隔符的协议时,Peek 只是查看缓冲内容,不会推进读取位置;Discard 才会消费字节。本文用一个简化帧协议拆开 Peek、Read、Discard、UnreadByte 的数据流转和边界处理。234 收藏 -
Go 把切片传入函数时,底层数组可能仍被共享,但切片头会按值传递。文章用最小示例解释 append 后为什么调用方的长度不变,给出返回新切片、指针修改与预分配三种边界清楚的写法,并说明 cap 足够时容易看到的隐藏覆盖。226 收藏 -
Go 的 PATCH 接口如果直接把请求体解码到普通结构体,字段缺失和显式 null 很容易被合并。本文用指针与 json.RawMessage 设计可验证的更新参数,说明两种方案的取舍、错误处理和兼容边界。226 收藏 -
Golang · Go问答 | 3星期前 | 连接池 · 性能排查 · database/sql · Go问答 · Go 连接池 DBStats sql.DB WaitCount SetMaxOpenConns
用一个 Go 后端小实验解释 sql.DB 的 WaitCount 为什么增长,如何从 InUse、Idle、WaitDuration 判断连接池是否太小,并给出 SetMaxOpenConns、SetMaxIdleConns 的调参和验证清单。214 收藏 -
Golang · Go问答 | 3星期前 | interface · 单元测试 · 架构设计 · repository · Go问答 · 单元测试 架构设计 interface 接口设计 Go问答 调用方定义 Repository
Go 项目里的 interface 通常更适合由调用方按需要定义,而不是在实现方提前造大接口。判断重点是依赖方向、测试替身、契约大小和未来演进成本。212 收藏 -
Golang · Go问答 | 2星期前 | channel · goroutine · pprof · Go问答 · 线上排查 · pprof Go问答 Go channel阻塞 goroutine堆积 channel发送
Go 服务出现 goroutine 数持续上涨、接口超时或后台任务堆积时,channel 发送阻塞是常见原因之一。排查时先看 goroutine profile 里的 chan send,再确认接收方是否退出、消费是否变慢、缓冲是否打满,并用超时退出或限流恢复服务。205 收藏 -
Go 1.21 引入的 log/slog 让结构化日志更容易落地,但字段从 slog.Any 到 Handler 再到 JSON 输出时,组、动态值和敏感字段仍有边界。本文用订单请求日志拆解字段流转、Handler 包装与脱敏验证。193 收藏 -
一次 Go 流式上传在异常路径卡死的排查记录:用 io.Pipe、CloseWithError 和 goroutine 栈定位背压与退出顺序问题,再补上可验证的清理和超时边界。182 收藏 -
Go 循环里反复调用 time.After 不一定立刻造成传统意义上的永久泄漏,但在高频循环里会让还没触发的定时器短时间堆积,内存和定时器队列压力都会上来。本文从现象排查到修复写法,讲清什么时候可以用 time.After,什么时候应该改成 time.NewTimer 并配合 Stop 和 Reset。181 收藏 -
用 sync.Pool 复用 bytes.Buffer 可以减少短生命周期对象的分配,但必须处理 Reset、取出类型和跨请求数据污染问题。本文从一次响应体串数据的故障现场出发,给出可验证的实现、边界和复查方式。173 收藏 -
Go 里 context 更适合作为一次请求或一次调用链的边界参数,而不是长期存进结构体。本文从适用压力、典型写法、反例和判断清单讲清什么时候传 ctx,什么时候不要存 ctx。166 收藏 -
Golang · Go问答 | 3星期前 | HTTP · net/http · Go问答 · 流式响应 · ResponseController · net/http FLUSH 流式响应 Go问答 ResponseController FullDuplex 写超时
用问答方式解释 Go net/http ResponseController 的定位、Flush、写入 deadline、FullDuplex 支持边界、兼容兜底和生产使用注意事项。161 收藏 -
本文用 Go 接口返回 JSON 的现象入手,逐步验证 nil slice 和空 slice 在 len、cap、底层数组、json.Marshal 输出上的区别,并给出 API 响应保持 [] 的初始化方案。157 收藏 -
本文用完整工作流讲解 Go defer 的常见疑问:为什么 defer fmt.Println(i) 打印旧值,defer 注册时参数何时保存,闭包为什么能读到新值,命名返回值如何在 defer 中包装错误,以及多个 defer 为什么按倒序触发。153 收藏