Go语言技术文章
-
Go 普通 map 不支持并发读写,读、写、删除和遍历必须进入同一个同步边界;本文用并发计数器演示 RWMutex 的封装方式,并说明何时评估 sync.Map。439 收藏 -
使用 archive/tar 解包时,先用 filepath.IsLocal 拒绝绝对路径和 .. 条目,再按 TypeDir 创建目录、按普通文件条目写入内容,保留 tar 原有目录结构。136 收藏 -
Go 的 map 遍历顺序没有语言保证,测试不应直接比较遍历结果的顺序;本文用排序、集合比较和显式顺序建模解决这类不稳定断言。163 收藏 -
用 Go 的 io.Pipe 把数据生产、gzip 压缩和 HTTP 请求体串成流,讲清同步背压、错误传播、取消处理以及 Content-Length 和重试边界。249 收藏 -
Go 的 range 循环里取变量地址,是否重复取决于循环变量是用 := 声明还是用 = 复用,以及模块采用的 Go 版本。本文用切片副本、切片元素地址和旧版本兼容写法说明如何判断与修复。501 收藏 -
Go 中需要把多个文件、字符串或网络输入按顺序交给同一个消费函数时,可以用 io.MultiReader 组成连续输入流。本文说明顺序读取、EOF、非 EOF 错误和底层资源关闭责任。426 收藏 -
Go 切片 append 后原切片数据也变化,通常是因为新切片仍复用了容量范围内的底层数组。本文用 len、cap 和三切片表达式判断复用边界,并比较 append 隔离与 copy 深度复制的选择。291 收藏 -
用 Go 包装 io.Reader,在不把整文件读入内存的前提下统计上传过程中已经读取的字节数。本文区分 Reader 进度、网络发送和服务端落盘边界,给出并发读取进度、失败重试与未知总大小的处理方式。127 收藏 -
Go 接口装入 typed nil 后为什么不等于 nil?本文用静态类型、动态类型和动态值拆开接口语义,解释 error 返回中的常见陷阱,并给出类型断言、反射与 API 边界的处理清单。113 收藏 -
Go 的 bufio.Scanner 默认有 token 缓冲上限。本文用长日志场景说明如何在第一次 Scan 前调用 Buffer,如何检查 Err,以及什么时候应该换用 bufio.Reader。140 收藏 -
Go 的 nil 指针接收者不一定一调用就 panic:方法可以先进入方法体,但字段解引用、值接收者和 nil 接口会形成不同边界。本文用最小示例拆开这些情况,并给出排查清单。179 收藏 -
Go 读取 CSV 时,字段中的逗号和换行必须放在双引号内,并交给 encoding/csv.Reader 解析。本文说明如何保留完整字段、区分列数错误与 ParseError,以及何时不该使用 LazyQuotes。157 收藏 -
Go map 多个 goroutine 同时读取通常没有读写冲突,但隐藏的刷新、延迟初始化或元素内部变更仍会触发数据竞态。本文用 RWMutex、race detector 和不可变快照拆清边界。207 收藏 -
面对超大 JSON 数组,不要先读成 []byte 再 Unmarshal;用 json.Decoder 从 io.Reader 逐项 Decode,并为输入总量和单个元素设置清晰边界。160 收藏 -
Go exec.Command 使用裸程序名时会经过 PATH 查找,Go 1.19 起不会隐式执行当前目录中的程序。本文说明 ErrDot 原因、显式相对路径写法,以及 Dir、PATH 和兼容处理的区别。194 收藏