Go问答技术文章
-
Go slog.Record 是值类型,但直接复制时可能共享属性切片的底层数组。本文解释 Record.Clone 如何隔离后续 AddAttrs 修改,并给出异步 Handler 传递日志记录时的安全写法。301 收藏 -
Go errgroup 首个错误后其他任务仍运行,通常不是取消失效,而是 worker 没有监听派生 Context,或使用了零值 Group。本文拆开错误传播、取消信号与 Wait 收敛的边界,并给出可协作退出的代码结构。141 收藏 -
Go goroutine 泄漏后不会被 GC 自动结束,通常是 channel、锁、WaitGroup 或 I/O 缺少可达的退出条件;本文从阻塞栈定位并用 context、关闭 channel 和 WaitGroup 修复。220 收藏 -
Go JSON 解码遇到类型不匹配时,利用 json.UnmarshalTypeError 的 Value、Type、Field 和 Offset 字段定位具体问题,区分语法错误、字段映射和部分成功结果。250 收藏 -
Go context 取消后任务仍在运行,通常不是 cancel 失效,而是 goroutine 没有监听 Done、阻塞调用没有接收 context,或收尾阶段被结果通道卡住。本文用循环、数据库调用和排查清单拆开这条边界。244 收藏 -
Go select 一旦加入 default,在所有通信都未就绪时就会立即返回;如果它被放进无条件 for 循环,循环会反复检查而形成忙等。本文解释选择规则,并给出阻塞等待、ticker 和退避三种改法。431 收藏 -
Go 的 URL.Path 保存解码后的路径,RawPath 只是可选的原始编码提示;需要重建请求或保留 %2F 等编码差异时,应优先调用 EscapedPath、String 或 RequestURI。250 收藏 -
Go atomic.Value.Swap 会把新值写入原子容器并返回替换前的值;首次调用返回 nil,但新值不能为 nil,后续调用还必须保持同一具体类型。本文用配置快照场景说明如何安全接住旧值并处理边界。334 收藏 -
sync.Once 保证回调只执行一次,并不保证执行到成功。文章区分永久保留首次结果、启动初始化与成功缓存,给出互斥保护的可重试配置示例,并说明取消等待、重试频率和资源生命周期的限制。229 收藏 -
Go sync.Pool 中对象放入后很快消失并不一定是并发错误,本文解释临时复用池的生命周期边界,并比较 Pool、带锁 map 与有界 channel 的适用场景。139 收藏 -
sync.Map 不是普通 map 的通用替代品。本文从高频覆盖写、固定值类型、多字段更新和 Range 遍历四个信号判断适用边界,并给出 Mutex、RWMutex 与组合方法的回滚方案。500 收藏 -
strings.Builder 已使用后不能按值复制,副本继续写入可能触发异常。本文定位参数、结构体和切片中的隐式复制,给出指针协作与字符串前缀重建两种迁移方式,并解释长度为零和未触发 panic 的误区。149 收藏 -
Go 普通 map 并发读写会触发数据竞争,严重时出现 fatal error。本文按访问边界说明原因,并比较 mutex、RWMutex、单协程所有权与 sync.Map 的适用场景。319 收藏 -
Go bytes.Buffer.Bytes 返回的是未读区切片视图,不是独立副本。本文说明 Read、Write、Reset、Truncate 为什么会让旧数据变化,并给出稳定快照的复制写法。457 收藏 -
Go regexp 中文匹配为空时,按输入、UTF-8 码点、ASCII 字符类、Unicode 类和字节下标逐项排查,解决中文匹配与位置错位问题。496 收藏