Go问答技术文章
-
Go 返回短子切片时,普通切片表达式仍会共享大数组。本文用 make+copy、slices.Clone 和 bytes.Clone 说明如何复制窗口数据,并解释三索引表达式为何不能解决内存持有问题。414 收藏 -
Go 切片别名共享底层数组时,append 可能覆盖另一份切片可见的数据。本文用 full slice expression 的第三个下标限制容量,并说明它对直接写入和其他别名的保护边界。257 收藏 -
Go 截取子切片后修改元素会影响原切片,根因是两个切片共享底层数组。本文用 len、cap、三下标切片、append、slices.Clone 和 copy 说明如何判断并隔离这类修改。213 收藏 -
sync.Map 虽然支持并发安全,但只针对少数访问模式优化。本文从单键写一次、不同 key 并发、同键频繁覆盖、复合更新和 Range 一致性几个角度,说明什么时候应该换回强类型 map 加 RWMutex。109 收藏 -
Go 普通 map 只有在初始化后不再写入时才适合被多个 goroutine 并发读取。本文拆开读写边界,说明 RWMutex、sync.Map、所有权模型和 race 检查器的使用场景。399 收藏 -
Go 普通 map 遇到并发读写时可能触发 fatal error。本文从访问边界、锁方案、sync.Map 和 channel 所有权对比入手,给出排查与修复清单。460 收藏 -
Go map 只有在所有 goroutine 都只读、没有任何写入时才可以安全并发读取。本文区分只读快照、sync.RWMutex、sync.Map 与 atomic.Value 复制替换,说明读写混合场景如何选择同步边界,并用 -race 检查遗漏。163 收藏 -
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 收藏