Go语言技术文章
-
Go slog 让标准库自带结构化日志能力,但落地时不能只把文本换成 JSON。更稳的迁移路线是先统一字段,再接入 JSONHandler,随后治理上下文、分组、脱敏和日志成本。219 收藏 -
Redis 过期键通知适合做自动清理的提醒信号,但不能当成可靠消息队列。更稳的做法是订阅事件触发清理任务,同时保留补偿扫描、幂等门禁、失败重试和告警复盘。441 收藏 -
Redis 热点 key 在高并发下同时过期,所有请求会一起回源数据库,表现为 DB QPS 突增、接口超时和 Redis 命中率下降。排查时先看热点 key 的 TTL、命中率和回源日志,修复时用互斥锁、逻辑过期、随机 TTL 和降级保护控制回源压力。119 收藏 -
Linux 上 df 显示磁盘满了,但 du 找不到大文件,常见原因是文件已经被删除却仍被进程占用。排查时先确认挂载点,再对比 df 和 du,最后用 lsof +L1 找 deleted 文件和 PID,按服务重启、日志切割或释放句柄恢复空间。470 收藏 -
Go HTTP 请求体本质上是一个流,读取一次后游标就到末尾。中间件或日志里先用 io.ReadAll 读过 body,后面的 JSON 绑定就可能拿到空内容。排查时看读取顺序、Content-Length 和绑定错误,修复时缓存字节并用 io.NopCloser 重新赋回 r.Body。244 收藏 -
Go 1.26 把 go fix 重写成基于 Go analysis framework 的现代化工具,能批量给旧项目应用更符合新版本的写法。旧项目升级时建议先用 -diff 预览,再分批提交、跑全量测试和灰度发布,不要把自动改写直接混进业务改动里。198 收藏 -
Golang · Go问答 | 2个月前 | channel · goroutine · pprof · Go问答 · 线上排查 · pprof Go问答 Go channel阻塞 goroutine堆积 channel发送
Go 服务出现 goroutine 数持续上涨、接口超时或后台任务堆积时,channel 发送阻塞是常见原因之一。排查时先看 goroutine profile 里的 chan send,再确认接收方是否退出、消费是否变慢、缓冲是否打满,并用超时退出或限流恢复服务。205 收藏 -
MySQL 读写分离不是简单把 SELECT 丢到从库。它适合读多写少、查询压力明显大于写入压力的业务,但会带来复制延迟、读己之写、路由规则和故障切换问题。上线前要先确认读写比例、数据一致性要求和回主策略。334 收藏 -
Golang · Go问答 | 2个月前 | 连接池 · database/sql · Go问答 · 线上排查 · MaxOpenConns Go数据库连接池 DBStats Go问答 sql.DB WaitCount
Go 服务接口突然变慢,sql.DB 连接池被打满是常见原因之一。排查时要先看 OpenConnections、InUse、Idle、WaitCount 和 WaitDuration,再决定是降载、回滚、调连接数,还是修慢查询和事务占用。355 收藏 -
Go 服务内存持续上涨时,先区分 RSS、heap、goroutine 和缓存增长,再决定是限流、回滚还是抓 pprof。线上处理需要先判断稳定性风险,再保留证据、止血恢复,并把告警阈值和复盘项补齐。467 收藏 -
Golang · Go教程 | 2个月前 | 跨域 · cors · Go教程 · net/http · 跨域 Access-Control-Allow-Origin 预检请求 Options Go教程 Go CORS
Go 接口被浏览器拦跨域时,不是简单加一个星号就完事。本文从浏览器 CORS 预检请求讲起,用 net/http 写一个可控的跨域中间件,说明 Origin 白名单、OPTIONS 响应、请求头放行和安全注意点。275 收藏 -
PHP 文件上传不能只判断扩展名后直接保存。更稳的做法是把上传当成一条数据生命周期:接收 $_FILES,检查错误码、大小、MIME 和真实扩展名,生成服务端文件名,保存元数据,并配套清理临时文件和过期文件。242 收藏 -
Go 写 SSE 接口时,浏览器 EventSource 连上却不显示消息,常见原因是响应没有按 text/event-stream 格式输出、写入后没有 Flush、代理层开启了缓冲,或者连接超时策略不适合长连接。本文用一个最小示例拆清排查路径和修复要点。333 收藏 -
Golang · Go问答 | 2个月前 | 并发安全 · RWMutex · sync.Map · Go问答 · RWMutex sync.Map Go问答 Go map并发读写 concurrent map writes
Go map 不是并发安全容器,多个 goroutine 同时写或读写交错时可能触发 fatal error。本文从线上 panic 现场出发,说明如何复现、定位原因,并在 RWMutex、sync.Map 和单 owner 模型之间做选择。102 收藏 -
Go 1.25 为 sync.WaitGroup 增加 Go 方法,适合只等待一组 goroutine 完成的场景。本文用旧写法对比新写法,说明迁移边界、错误处理选择和最小验证方式。172 收藏