Go语言技术文章
-
Go 把切片传入函数时,底层数组可能仍被共享,但切片头会按值传递。文章用最小示例解释 append 后为什么调用方的长度不变,给出返回新切片、指针修改与预分配三种边界清楚的写法,并说明 cap 足够时容易看到的隐藏覆盖。226 收藏 -
Go 的 PATCH 接口如果直接把请求体解码到普通结构体,字段缺失和显式 null 很容易被合并。本文用指针与 json.RawMessage 设计可验证的更新参数,说明两种方案的取舍、错误处理和兼容边界。226 收藏 -
Go slog 让标准库自带结构化日志能力,但落地时不能只把文本换成 JSON。更稳的迁移路线是先统一字段,再接入 JSONHandler,随后治理上下文、分组、脱敏和日志成本。219 收藏 -
Golang · Go教程 | 2星期前 | Context · 超时控制 · Go教程 · http.Client · Transport · Go context 请求超时 Transport http.Client Client.Timeout ResponseHeaderTimeout
Go HTTP 客户端超时不要只靠一个 context 或一个 Client.Timeout。更稳的做法是把总预算、连接、TLS 握手、响应头和读取阶段分开设置,再用错误判断和日志字段确认到底卡在哪一段。218 收藏 -
Go 项目日志从 fmt.Println 迁到 slog,不只是换一个打印函数。本文用接口调用链场景讲清 slog 字段设计、上下文传递、Handler 选择、敏感字段处理和灰度接入路径。217 收藏 -
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教程 | 1星期前 | 并发 · WaitGroup · go · worker pool · 服务停机 · Go channel WaitGroup 优雅停机 worker pool 任务排空
从一次发布后异步任务少处理的故障出发,拆解 Go worker pool 的关闭顺序:先停止接收、再关闭任务输入、让 worker 排空并由 WaitGroup 收尾,同时说明超时退出与任务持久化的边界。207 收藏 -
Golang · Go教程 | 2天前 | JSON · 基准测试 · go · 性能优化 · 内存分配 encoding/json json.RawMessage json.Decoder Go JSON
Go 服务处理大批量 JSON 时,直接把请求体解码成完整结构体并不总是划算。本文用订单事件示例比较 json.Unmarshal、json.Decoder 和 json.RawMessage 的分配与吞吐边界,并给出可复现的基准测试写法。206 收藏 -
Golang · Go问答 | 2星期前 | channel · goroutine · pprof · Go问答 · 线上排查 · pprof Go问答 Go channel阻塞 goroutine堆积 channel发送
Go 服务出现 goroutine 数持续上涨、接口超时或后台任务堆积时,channel 发送阻塞是常见原因之一。排查时先看 goroutine profile 里的 chan send,再确认接收方是否退出、消费是否变慢、缓冲是否打满,并用超时退出或限流恢复服务。205 收藏 -
Golang · Go教程 | 1星期前 | 并发 · HTTP · 性能优化 · 故障排查 · Go教程 · Go Goroutine 连接复用 pprof http.Client close Response.Body
Go 服务里调用 http.Client 后,Response.Body 没有在所有路径关闭,连接会被持续占用,pprof 里常能看到 net/http 相关 goroutine 增长。用 defer resp.Body.Close()、完整处理响应体、复用 Client,并通过压测与连接指标复查,可以把这类问题收住。201 收藏 -
本文用一个 Go HTTP 接口示例,把 log/slog 的 JSONHandler、Logger.With、请求字段和本地检查串起来,说明如何把普通日志变成可检索、可过滤、可定位的结构化日志。194 收藏 -
Go 1.21 引入的 log/slog 让结构化日志更容易落地,但字段从 slog.Any 到 Handler 再到 JSON 输出时,组、动态值和敏感字段仍有边界。本文用订单请求日志拆解字段流转、Handler 包装与脱敏验证。193 收藏 -
Go 拼接文本时,strings.Builder、bytes.Buffer、[]byte 和 strings.Join 的选择取决于输出类型、是否需要读取字节以及片段是否已准备好。文章用最小示例、边界表和基准测试说明各自适用场景。188 收藏 -
一次 Go 流式上传在异常路径卡死的排查记录:用 io.Pipe、CloseWithError 和 goroutine 栈定位背压与退出顺序问题,再补上可验证的清理和超时边界。182 收藏