处理大二进制文件应分块读取,用os.Open和io.ReadFull确保读满固定长度;binary.Read解析结构化数据需注意大小端与字段对齐;bufio.Writer批量写入须Flush;mmap适用于超大文件随机访问,需手动Munmap。
用 os.Open 和 io.ReadFull 安全读取固定长度二进制块
直接用 os.ReadFile 读整个文件在处理大文件(如几百 MB 的图片、音频或自定义格式数据)时容易爆内存。更稳妥的做法是分块读取,尤其当你知道每条记录是固定字节长度(比如 1024 字节一个数据帧)时。io.ReadFull 能确保读满指定长度,避免因底层 Read 返回短字节而漏数据。
常见错误是用 io.Read 循环读但没检查返回长度,导致解析错位。例如解析一个 4 字节整数头后紧接 256 字节 payload,若头只读了 3 字节就继续往下读,整个结构就崩了。
- 打开文件务必用
os.Open(非os.Create),并检查err - 用
make([]byte, N)预分配缓冲区,N 是你要读的精确字节数 - 调用
io.ReadFull(reader, buf);返回io.ErrUnexpectedEOF表示文件提前结束,不是普通 EOF - 对关键字段(如 magic number、长度字段)做校验,别假设文件一定合法
用 binary.Read 解析结构化二进制协议
当二进制文件有明确字段布局(如 C struct:uint32 len + uint16 type + [64]byte name),手写位移和掩码太易错。binary.Read 可以把字节流直接解包进 Go 结构体,前提是结构体字段加 binary tag 并按顺序排列。
注意大小端必须与文件一致——网络协议常用 binary.BigEndian,Windows PE 文件用 binary.LittleEndian。传错会导致数值全乱(比如 0x01000000 变成 1)。