Go语言技术文章
-
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 收藏 -
Go gzip 解压出现校验错误时,优先检查压缩流是否完整收尾、读取是否到达 EOF,以及多成员流和网络截断边界。321 收藏 -
Go ZIP 文件名乱码通常不是压缩内容损坏,而是文件名字节、UTF-8 标志和解压工具的本地编码解释不一致。本文从 archive/zip 的 Writer、Reader 和 NonUTF8 语义出发,给出创建端与旧包读取端的处理边界。352 收藏