Go问答技术文章
-
本地 go.mod replace 能编译,不代表 CI checkout 后也能找到同一个目录。本文从路径相对位置、替换模块的 go.mod、require 生效条件和 CI 工作区布局四处排查,给出可复现的检查命令与修复选择。342 收藏 -
Go sync.Mutex.TryLock 适合可选的最佳努力工作,不适合代替带超时的 Lock。本文解释成功与失败的同步语义、测试难点,以及如何用确定的同步结构保护核心业务。195 收藏 -
Go 的 sync.RWMutex 会让已持有的读者先完成,写者等待后阻止新的读者进入,从而避免写操作长期饥饿。367 收藏 -
Go 中通常把 sync.Mutex 作为值字段嵌入结构体,再用指针接收者编写方法。本文解释值接收者为何会复制锁,以及何时才适合使用 *sync.Mutex。443 收藏 -
Go 里 range channel 一直不退出,通常不是 range 语法错,而是发送方完成后没有关闭 channel。本文用一个最小生产者消费者示例拆清关闭责任,并说明多发送方、nil channel 和提前 close 的边界。245 收藏 -
time.AfterFunc 会在独立 goroutine 中执行回调。本文用事件 channel、stop 信号和 callbackDone 完成信号,说明如何让主 goroutine 安全接收超时事件,并处理 Stop、Reset 与回调并发边界。109 收藏 -
Go select 同时有多个 case 可以执行时不会按书写顺序固定选择,而是从可执行通信中做均匀伪随机选择。本文说明求值规则、常见误区,以及如何实现尽力或严格优先级。291 收藏 -
Go select 在多个通信操作同时就绪时不会按 case 顺序提供业务优先级,而是选择一个可执行通信。本文用高价值、普通和后台三类通道说明非阻塞探测、处理预算、关闭边界与防饥饿设计。417 收藏 -
Go select 可以用 nil channel 动态屏蔽一个通信分支:初始设为 nil,启用时切换为有效 channel,停用或关闭后再置 nil。本文说明 select 的重算边界、关闭处理和 default 常见坑。477 收藏 -
多个 goroutine 共用一个 channel 时,不要让任意发送方直接关闭它。本文用 WaitGroup 统一等待发送方,用协调者关闭数据 channel,并用 done 处理接收方提前退出,避免 send on closed channel 和发送 goroutine 泄漏。312 收藏 -
Go 关闭带缓冲 channel 后,已经写入缓冲区的元素仍会按顺序读完。本文用代码说明 close、ok、range 与零值判断的边界。436 收藏 -
Go 的切片不能直接作为 map key,因为切片不是可比较类型。本文解释编译期限制、interface 动态键的 panic,并给出字符串、数组和结构体三种迁移方案。396 收藏 -
Go 在单 goroutine 中允许 range map 时 delete,但遍历顺序不稳定,新增键可能跳过;并发读写仍需锁或单 goroutine 所有权。426 收藏 -
Go maps.Clone 传入 nil map 后,返回值仍是 nil:读取安全但写入会 panic。本文对比 nil map 与空 map 的长度、读写和初始化差异,并说明 Clone 对嵌套 slice、map、指针值仍是浅复制。152 收藏 -
slices.Clone 会复制元素并保留输入切片的 nil 语义;copy 只搬运元素,目标切片是否为 nil、长度够不够,都由调用方先决定。本文用对照代码说明两者的边界。479 收藏