Go语言技术文章
-
Go 的 http.ServeContent 已经处理了文件下载中的 Range 和 If-Modified-Since,但 ETag 需要应用自己补上。本文用一个小型下载接口拆开请求头、响应状态与验收方式,避免把 200、206、304 混成一种成功。111 收藏 -
time.Duration.String 会自动选择合适单位,但负值、纳秒尾数和日志截断常让排查结果失真。本文用可复现实例说明 String 与 Truncate 的边界。110 收藏 -
用 atomic.Value 保存不可变配置快照,让热更新线程整份替换配置,并发请求只读当前快照,避开半更新状态与类型不一致 panic。110 收藏 -
用 Go container/ring 实现固定容量的最近采样窗口,说明如何写入、覆盖最旧值,并按时间顺序导出有效数据。110 收藏 -
通过一个 Go map 并发读写 panic 案例,解释普通 map 为什么不是并发安全的,并对比 RWMutex、sync.Map、分片 map 和 channel 拥有者模式的适用场景。109 收藏 -
Golang · Go教程 | 1个月前 | golang · 缓存 · singleflight · go · 高并发 · 后端开发 · Go 并发控制 缓存失效 请求合并 singleflight 回源
一个热门缓存键刚失效时,几百个请求可能同时回源,把数据库或下游接口推到峰值。Go 的 golang.org/x/sync/singleflight 能让同一个 key 的重叠调用只保留一趟加载,其余调用等待并复用结果。这里用一个商品读取场景说明放置位置、key 范围、多实例边界、错误传播和上线核对项。109 收藏 -
Go sync.Pool 里的对象会消失,是因为它只承诺临时对象复用,不承诺持久保存:池中元素可被运行时自动移除,Get 也可能直接把池当作空池。本文用 New、Get、Put 示例说明正确用法,并划清 sync.Pool 与业务缓存的边界。109 收藏 -
Go 1.24 引入 runtime.AddCleanup 后,资源包装对象可以把兜底清理与显式 Close 分开。本文用一个文件描述符包装示例说明 AddCleanup、Cleanup.Stop、KeepAlive 的调用边界,以及为什么它不能替代显式关闭。108 收藏 -
Golang · Go问答 | 1个月前 | 微服务 · Redis · postgresql · go · 性能优化 · Redis连接池 Go连接池 PostgreSQL连接池 context超时 并发预算
一个 Go 接口同时查 Redis 和 PostgreSQL 时,连接池参数不能照搬默认值。本文从请求并发、缓存命中率和数据库连接上限出发,拆开两套连接池与 context 超时预算,给出可复现的配置、指标和回退判断。107 收藏 -
Go 1.25 将 testing/synctest 正式带入标准库,测试超时、定时器和并发协作时不必再真实等待。本文用一个带 deadline 的通知流程说明 synctest.Test、synctest.Wait、时间推进和版本兼容边界。107 收藏 -
context.WithValue 适合传递贯穿请求链的元数据,不适合替代函数参数或承载业务配置。本文用键类型、取值失败和测试隔离三个边界,说明什么时候该用、什么时候该拆出显式参数。107 收藏 -
Go 1.26 的 errors.AsType 用泛型简化错误类型提取。本文用 PathError 和 ErrNotFound 讲清返回值、零值、errors.Is 以及旧版本兼容边界。106 收藏 -
Go 1.27 新增 crypto/mldsa 标准库包。本文用最小示例说明 ML-DSA-44 的密钥生成、签名、验签、Context 约束,以及 FIPS 140-3 模块下的可用性边界。106 收藏 -
Go 的 sync.Cond 适合让 goroutine 等待一个由共享状态表达的条件。本文用一个有界任务队列拆开 Wait、Signal 与 Broadcast 的正确顺序,并补上退出、空队列和误唤醒后的核对方法。105 收藏 -
Go sync.Cond 的关键不是把 Signal 换成 Broadcast,而是让等待条件、互斥锁和唤醒范围保持一致。本文从有界队列场景出发,拆解 Wait 的循环写法、Signal 与 Broadcast 的选择、丢唤醒风险和可验证的测试边界。104 收藏