Go问答技术文章
-
Go HTTP 服务收到 SIGTERM 后,用 NotifyContext 接管信号,再以带截止时间的 Server.Shutdown 停止监听并等待活动请求完成。222 收藏 -
Go os/signal.Notify 向 channel 发送时不会阻塞,缓冲已满的通知可能被丢弃。本文按退出信号、多个信号和慢消费者三类场景说明容量选择、消费循环、NotifyContext 与可靠状态记录。190 收藏 -
signal.NotifyContext 返回的 stop 不只是结束 context,它还会注销信号接管并释放关联资源。本文用优雅退出、重复测试和短生命周期任务说明 stop 的调用时机与边界。282 收藏 -
Go encoding/gob 解码到已有结构体时不会先清空目标,流中缺少的字段和发送端被省略的零值字段可能继续保留旧内容。本文用最小示例说明字段合并语义,并比较复用目标、解码到新变量和存在性字段三种处理方式。319 收藏 -
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 收藏