Go语言中读取文件部分内容主要用*os.File的ReadAt方法,它支持从指定偏移量随机读取且不改变文件位置;也可用Seek+Read组合实现灵活定位;读文本行需自行解析,因行长度不确定。

Go语言中读取文件部分内容(比如从指定偏移量开始读取若干字节)主要依靠 *os.File 的 ReadAt 方法,它支持随机访问,不改变文件当前读写位置,适合按字节偏移精准读取。
使用 ReadAt 按偏移量读取指定字节数
ReadAt 是最直接的方式:传入一个字节切片和起始偏移量,它会从该位置开始最多读取 len(buf) 个字节,返回实际读取数和可能的错误。
示例:读取文件第 100 字节开始的 512 字节
file, err := os.Open("data.bin")
if err != nil {
log.Fatal(err)
}
defer file.Close()
buf := make([]byte, 512)
n, err := file.ReadAt(buf, 100) // 从第100字节(0-based)开始读
if err != nil && err != io.EOF {
log.Fatal(err)
}
// buf[:n] 即为读到的内容
用 Seek + Read 组合实现灵活控制
如果需要多次不同偏移读取,或后续还要继续顺序读,可用 Seek 定位再调用普通 Read。注意 Seek 会改变文件内部偏移指针。
立即学习“go语言免费学习笔记(深入)”;
-
file.Seek(offset, io.SeekStart):从文件开头偏移offset字节 -
file.Seek(offset, io.SeekCurrent):相对于当前位置偏移 -
file.Seek(0, io.SeekEnd)配合Seek(-n, io.SeekCurrent)可读末尾 n 字节
示例:跳过前 200 字节,读接下来 100 字节
_, err := file.Seek(200, io.SeekStart)
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 100)
n, err := file.Read(buf)
处理边界与错误的常见要点
按偏移读取容易遇到文件长度不足、越界等情况,需主动检查:
-
ReadAt在到达 EOF 时返回io.EOF,但只要读到至少 1 字节就返回n > 0,错误不一定是失败 - 读取前可用
file.Stat()获取文件大小,提前判断offset + len(buf)是否越界 - 若只需读某一段且不关心后续操作,优先用
ReadAt;若要混合顺序读+跳读,用Seek更清晰
读取文本文件某一行?需自行解析
Go 没有内置“按行偏移读取”方法。如果目标是读第 N 行,不能仅靠字节偏移——因为行长度不确定。稳妥做法是:
- 用
bufio.Scanner逐行扫描,计数到目标行再提取 - 若文件超大且已知大致偏移(如日志有固定头),可先
Seek到附近,再向后找第一个\n对齐行首
纯字节偏移读取适用于二进制、固定格式(如 ELF、PNG)、或已知结构的文件,对文本行需额外逻辑对齐。










