Go问答技术文章
-
Go 1.23 支持对特定函数类型使用 for range。文章给出 iter.Seq 的最小写法,解释 yield 返回 false 的停止契约、三种允许签名、go.mod 版本边界和面向旧工具链的采用建议。251 收藏 -
Go 服务重新发布后,用户仍拿到旧 JS 或旧 CSS,通常不是浏览器“没刷新”,而是入口 HTML 与带指纹资源用了同一套缓存策略。本文用 Cache-Control、ETag 和文件名指纹拆出一套可验证的静态资源发布方式。251 收藏 -
Go 解析 JSON 时,struct、map[string]any 和 json.RawMessage 适合不同场景。字段结构稳定时优先用 struct,临时排查或不固定字段可以用 map,嵌套消息需要延迟处理时用 RawMessage,生产接口还要配合 UseNumber 和 DisallowUnknownFields 做边界控制。250 收藏 -
Golang · Go问答 | 3星期前 | HTTP · Cookie · 浏览器 · cors · Go问答 · SameSite · cookie cors Secure SameSite Go问答 Set-Cookie 跨站请求 credentials
Go 接口已经返回 Set-Cookie,但浏览器下一次请求不带 Cookie,通常要同时检查 SameSite、Secure、Domain、Path、CORS 和前端 credentials。246 收藏 -
strings.Builder 的零值可直接使用,但写入后再按值复制会触发 panic。文章用传值参数、切片 append 和正确传指针的对比,说明 Builder 的安全边界与重构方法。246 收藏 -
Golang · Go问答 | 5天前 | 并发 · Go问答 · Go测试 · testing/synctest · 虚拟时间 · time.Sleep Go 1.25 testing/synctest Go并发测试 虚拟时间 flaky test
Go 并发测试里大量 time.Sleep 往往又慢又不稳定。Go 1.25 已将 testing/synctest 纳入标准库,可在受控测试环境中使用虚拟时间和 synctest.Wait 检查后台任务的稳定状态。本文用延迟写缓存的例子说明最小迁移方式、适用边界和回归检查。246 收藏 -
Go 测试容易因临时文件残留、环境变量串值而偶发失败。本文整理 t.TempDir、t.Setenv 和 t.Cleanup 的使用顺序、并行限制和检查清单,让测试资源能自动收口。245 收藏 -
回答 Go 并发读写 map 应该选 map+RWMutex、sync.Map 还是分片 map,按读写比例、热点键、维护成本和扩展性给出选择规则与代码示例。244 收藏 -
Golang · Go问答 | 1星期前 | 性能排查 · net/http · HTTP客户端 · Go问答 · 连接复用 · 连接复用 keep-alive http.Transport Response.Body Go HTTP Client
Go 服务的请求量并不高,客户端却不断新建 TCP 连接时,先看 Response.Body 是否在所有分支读到 EOF 并关闭。Go 官方文档说明,Body 未同时读完和关闭时,底层 Transport 可能无法复用持久连接。本文从一次连接数异常的现场出发,给出定位、修复和边界判断。241 收藏 -
Golang · Go问答 | 1天前 | 标准库 · 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 收藏