Go问答技术文章
-
Go map 的 value 是指针时,单独判断 v == nil 会混淆缺失键和已保存的 nil。用 comma-ok 先判断键是否存在,再判断指针值,map[string]any 还要留意 typed nil。226 收藏 -
Go map 读取不存在的键不会报错,而是返回元素类型的零值。本文用 comma-ok 语法区分键不存在与真实零值,并说明 nil map 的读取和写入边界。269 收藏 -
context.WithValue 取不到键时不要直接强制断言。本文用私有 key、类型安全访问器和默认值策略,区分值缺失、显式 nil 与类型不匹配,避免 panic。454 收藏 -
Go context.WithValue 不要直接使用 string 或 int 作为跨包 key。本文用包内私有 key 类型和类型安全访问器,解决值碰撞、嵌套覆盖与类型断言分散的问题。123 收藏 -
Go 用 context.WithValue 传 trace id 时,key 不要直接用 string;用包内私有类型配合类型化存取函数,既能避免跨包碰撞,也能限制值只服务于请求链路。481 收藏 -
Go context deadline 到期不会强制杀掉后台 goroutine。本文用 Done、Err、可取消阻塞点和 WaitGroup 拆解不退出原因,并给出安全的协作式退出写法。368 收藏 -
Go context.WithDeadline 派生子上下文时,deadline 只能更早不能延后。本文用原创示例说明父子截止时间、cancel 释放、Err 判断和多层预算的边界。477 收藏 -
Go 中 context deadline exceeded 表示截止时间到期,context canceled 表示主动取消。本文用 errors.Is、ctx.Err 和 context.Cause 说明判断边界、错误包装与日志重试处理。337 收藏 -
Golang · Go问答 | 2星期前 | Context · 并发控制 · Go问答 · Go 资源清理 sync.Once context.WithCancel context.CancelFunc
Go 的 CancelFunc 可以被多个 goroutine 重复调用,但这不代表文件、连接和事务清理也天然幂等。本文用统一停止入口、等待工作退出和 sync.Once 设计多入口收尾,说明取消信号与资源释放的边界。441 收藏 -
Go context.WithCancel 的父子关系是单向取消传播:父 context 取消会让子 context 和后代一起结束,子 context 取消不会影响父 context 或兄弟节点。本文用代码说明 Done、Err、cancel 和资源释放边界。100 收藏 -
长任务不要把所有 cancel 都拖到最外层释放。本文用 Go context.WithCancel 说明阶段级上下文的创建、取消传播、并行 worker 退出和错误区分。287 收藏 -
Go 1.23 起,失去引用的 time.After 定时器可以被回收,但高频循环每轮创建 timer 和 channel 仍有分配与调度成本。本文说明 time.After 的适用边界,以及如何用可复用 Timer 配合 Stop、排空和 Reset。501 收藏 -
Go select 没有 default 并不是异常:当所有通信 case 都暂时不可执行时,当前 goroutine 会等待;本文区分缓冲、关闭和 nil channel,并给出 default、超时与取消的选择方法。427 收藏 -
Go select 同时命中多个 ready case 时不会按书写顺序执行,而是从可继续的通信中选择一个。本文解释 ready、default、关闭通道和优先级改写之间的边界。225 收藏 -
Go 的 range 接收循环不会因为暂时没有值就结束,必须等 channel 被关闭并且关闭前发送的值全部取出。本文说明关闭责任、双值接收、nil channel、缓冲 channel 和多发送方协调的边界。238 收藏