Go问答技术文章
-
Go 的 os.Rename 在目标文件已存在时按文档可以替换普通文件,但 Windows 仍可能因目标被占用、共享模式、只读属性、目录目标或非原子语义失败。本文用四个错误信号拆分原因,并给出同目录临时文件、关闭句柄和避免先删后换的可靠写法。419 收藏 -
Go 用 os.OpenFile 创建文件时,perm 只是 Unix 上 umask 处理前的请求值;本文区分新旧文件、O_TRUNC 与跨平台权限语义,帮助定位不同机器上的权限差异。492 收藏 -
Go gzip 读取报校验错误时,部分明文不能直接使用。本文用完整文件读取示例区分校验不匹配、截断和其他错误,说明暂存提交、Close 与资源限制的边界。280 收藏 -
Go archive/tar 读取 unexpected EOF 时,关键是区分正常归档结束与条目数据未读满。本文结合 Header.Size、实际读取字节数和 Next 的边界行为,给出定位截断归档的排查写法。439 收藏 -
Go 的 netip.ParseAddr 不只解析普通 IPv4 和 IPv6,也能保留带作用域 zone 的 IPv6 地址。本文说明带百分号的地址如何解析、怎样读取 Zone、如何避免把端口误传给 ParseAddr。346 收藏 -
io.EOF 通常表示输入已经正常耗尽,不是业务失败。本文用 io.Reader 和 io.ReadFull 对比正常结束、数据未消费、结构化截断与真实读取错误的处理边界。141 收藏 -
Go append 是否共享数组取决于追加后长度与原容量。通过固定容量示例定位覆盖位置,区分限制容量与复制元素存储,并明确切片接口的共享和修改约定。427 收藏 -
Go 子切片不会复制底层数组,长期保存一个很小的窗口也可能让大数组持续可达。本文从 len、cap 和引用关系入手,说明何时必须复制、full slice expression 能解决什么,以及如何避免缓存和结构体字段继续持有旧数组。440 收藏 -
Go 字符串转 []byte 时,普通转换会复制数据,unsafe.StringData 与 unsafe.Slice 则可能创建只读别名。本文说明别名写入、append、uintptr 中转、空字符串和长度边界的生命周期风险,并给出安全的封装与选择建议。491 收藏 -
Go reflect.Elem 遇到 nil 指针时会返回零 Value,而不是一个空的结构体值。本文区分 nil 指针、nil interface 与无效 Value,说明 Kind、IsNil、Elem、IsValid 的安全判断边界,并给出多级指针的处理方式。349 收藏 -
Go 的 json.Encoder 默认会转义 JSON 字符串中的 &, < 和 >。本文用输出对比说明 SetEscapeHTML(false) 改变了什么,并给出普通接口、日志与 HTML 嵌入场景的选择边界。107 收藏 -
Go interface 比较时,动态类型相同但值不可比较就可能触发 comparable panic。本文拆解 slice、map、func 的边界,并给出类型收窄、字段比较和 reflect.Type.Comparable 保护方案。328 收藏 -
Go 的 slice 不能直接作为 map key,因为 slice 不支持完整的 == 比较。本文用 string、定长数组和可比较 struct 给出按内容与复合条件建索引的替代方案,并说明 any、泛型和长度边界。280 收藏 -
Go map 的 range 顺序本来就不保证稳定,测试直接比较遍历结果就会偶发失败。本文用一个小型测试工具拆开集合断言与顺序断言,让 map 测试稳定且不掩盖真实数据错误。353 收藏 -
Go encoding/json 的 omitempty 不会自动按自定义 IsZero 省略结构体字段。应使用 omitzero,并区分未提供、显式零和有效值;组合标签按空或零任一条件省略。384 收藏