Go问答技术文章
-
Go 的 os.ReadDir 会按文件名排序,而 File.ReadDir 按目录顺序读取。本文解释两者差异、字典序与自然排序的边界,以及 n 参数和 io.EOF 的处理方式。183 收藏 -
Go filepath.Glob 返回空切片不一定是异常:模式写错才会返回 filepath.ErrBadPattern,而目录不存在、没有匹配项和部分文件系统错误可能都表现为空结果。本文给出清晰的判断与补查方式。189 收藏 -
Go 临时文件泄漏要区分句柄未关闭与路径未清理。本文从批处理场景拆解 defer 作用域、文件所有权与错误回传,给出单任务关闭和删除的完整写法。193 收藏 -
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 收藏