Go问答技术文章
-
Go encoding/gob 传输接口值时需要注册实际承载的具体类型。本文用 Shape 和 Circle 拆解静态类型、动态类型与流中类型名的关系,给出值和指针注册边界、跨进程初始化方式,以及用错误数、分配次数和消息大小验证修复的方法。454 收藏 -
Go encoding/gob 不会传输 nil 指针,但当流中存在指针字段时,Decoder 会为 nil 目标字段分配对象。本文用 Envelope 示例拆开这层语义,并给出 HasMeta 加值字段的传输结构,避免把隐式分配误当成业务状态。169 收藏 -
Go base64.CorruptInputError 中的数字是原始输入的零基字节偏移,不是解码结果长度。本文用 errors.As 提取偏移,并说明非法字符、换行、补位和 Strict 模式的排查边界。280 收藏 -
Go 的 StdEncoding 会保留 Base64 的 = 补位,RawStdEncoding 使用相同字母表但省略补位。本文用输入长度、编解码配对和 URL 字母表三个边界说明如何选择。228 收藏 -
Go base64.NewEncoder 会缓存不足三个字节的尾部数据。本文按输入长度余数说明忘记 Close 时标准 Base64 会少掉多少字符,并给出显式 Close、错误检查和边界回归测试的修复方法。303 收藏 -
Go encoding/xml 中,嵌套类型的 XMLName 显式标签与外层字段标签不一致会触发名称冲突。本文用固定根节点和可复用子节点两个写法说明如何稳定解码,并梳理命名空间、大小写和 Marshal 的边界。490 收藏 -
解释 Go encoding/xml 的 Token API 为什么会让保存的 xml.CharData 被后续内容覆盖,并给出 CharData.Copy、string 和 CopyToken 的正确选择。399 收藏 -
Go xml.Decoder 的 Strict=false 不是万能容错开关。本文用缺失结束标签、未知实体、孤立结束标签、命名空间和字符集几个输入,拆开说明哪些问题会被放宽,哪些仍必须修复或显式处理。128 收藏 -
自定义错误实现 Error 并不等于 errors.Is 能按业务含义匹配。本文从默认相等规则出发,说明何时实现 Is、如何按稳定字段比较,以及 Is、Unwrap 和哨兵错误的职责区别。466 收藏 -
Go errors.As 的关键不是把错误再断言一次,而是按 error 实现方式声明目标变量。本文区分值错误和指针错误,说明包装后为何要传入 *T 或 **T,并给出排查清单。391 收藏 -
Go 1.20 引入 errors.Join 后,一个返回值可以同时携带多个错误。只要使用 errors.Is 检查哨兵错误,匹配仍会沿着多子错误树继续进行;关键是区分结构化匹配、文本展示和 nil 过滤。198 收藏 -
Go atomic.Value 不能把 nil 接口和 *Config 混着存。用 typed nil 指针固定具体类型,再用不可变配置快照完成安全的可选配置热更新。164 收藏 -
Go sync.Cond Broadcast 唤醒所有等待者,但不保证条件仍然成立。本文用任务队列说明如何用同一把锁保护状态、用 for 循环检查条件,并排查看似丢失唤醒的问题。377 收藏 -
读多写少不等于一定该用 sync.RWMutex。本文从读临界区、写者等待、锁升级限制和实际基准四个角度,说明如何在 Mutex 与 RWMutex 之间做出可验证的选择。131 收藏 -
Go select 中加入 default 后,消费者在没有消息时会立即返回,放进无限循环就可能形成高频空轮询。本文说明空转根因,并给出阻塞接收、定时退避、批处理和退出信号的选择边界。332 收藏