Go问答技术文章
-
errors.Unwrap 只调用 Unwrap() error,因此不会拆开 errors.Join 产生的 Unwrap() []error。本文说明单链与错误树的区别,以及 Is、As 和显式枚举的正确用法。364 收藏 -
errors.Is 只在第一个参数的错误树上匹配:比较当前节点、调用当前节点的 Is(target),再展开子错误。本文解释为何目标值的 Is 不会被反向调用,并给出正确的自定义匹配方式。301 收藏 -
errors.As 的 target 不是普通比较值,而是接收匹配错误的可写槽位。本文用最小实验解释双指针写法、三个 panic 条件、错误树匹配规则,以及新版 errors.AsType 的替代方式。458 收藏 -
errors.Join 的多行结果不是 fmt 额外插入的换行,而是标准库按每个子错误的 Error 文本逐项拼接的结果。本文说明格式化原因、错误树判断方式,以及日志和接口层的迁移边界。421 收藏 -
Go Decoder.DisallowUnknownFields 只保证遇到未知结构体字段时返回错误,并不负责收集全部错误。本文解释首个错误的保存机制,并给出严格解码与顶层批量提示方案。261 收藏 -
解释 Go json.RawMessage 的字节所有权边界,区分 Unmarshal 已复制和直接切片转换未复制的场景,并给出长期保存原始 JSON 的安全写法。330 收藏 -
json.Number 保存的是 JSON 数字原文,而 Int64 内部按十进制整数调用 strconv.ParseInt。1.5、1e3 虽是合法 JSON 数字,却不是 Int64 接受的整数文本;超出 int64 范围则会返回 range error。357 收藏 -
json.Decoder.More 只回答当前数组或对象里是否还有元素,不能单独判断顶层 JSON 流是否还有数据。本文区分 More、Token、Decode 与 io.EOF 的边界,并给出遍历容器、读取连续顶层值和拒绝尾随数据的写法。225 收藏 -
FieldsPerRecord 设为 0 不是关闭校验,而是让 encoding/csv 用第一条记录的字段数作为后续标准,因此列数变化仍会返回 ErrFieldCount。真正允许变长记录应设为负数;引号等 CSV 语法错误则不会被该设置忽略。301 收藏 -
Go csv.FieldPos 的 column 按 UTF-8 字节计算,不按字符计算。本文用中文 CSV 说明字段起点、解析错误和展示层字符位置如何分开处理。389 收藏 -
csv.Reader.InputOffset 返回输入流当前读取位置,也就是最近一条记录的末尾与下一条记录的开头,不是字段坐标。本文说明它与 FieldPos、ParseError 的区别,以及如何用记录边界实现可靠的 CSV 进度检查点。225 收藏 -
csv.Reader 开启 ReuseRecord 后,连续 Read 可能共享上一条记录的底层数组,因此保存旧切片会看到内容变化。本文用对比示例说明何时可以直接复用、何时必须复制,以及缓存和 goroutine 场景的安全写法。240 收藏 -
sql.Null[T] 的 V 字段即使在 Valid=false 时也必须持有类型 T 的 Go 零值,但这不代表数据库存了零值。本文说明 V、Valid 与 Value() 的语义,并给出避免误判 SQL NULL 的写法。497 收藏 -
sql.NamedArg 只把名称和值交给 database/sql 与具体驱动,并不会统一不同数据库的命名占位符。本文说明名称校验、驱动能力和 SQL 语法三个拒绝点,并给出可直接套用的排查代码。233 收藏 -
解释 Go database/sql 中 Rows.Next 返回 false 的双重语义,给出 Next、Scan、Err、Close 的正确组合,并说明如何避免迭代失败时静默返回半截数据。171 收藏