

新闻资讯
技术学院Go语言中读取文件部分内容主要用*os.File的ReadAt方法,它支持从指定偏移量随机读取且不改变文件位置;也可用Seek+Read组合实现灵活定位;读文本行需自行解析,因行长度不确定。
Go语言中读取文件部分内容(比如从指定偏移量开始读取若干字节)主要依靠 *os.File 的 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 会改变文件内部偏移指针。
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)、或已知结构的文件,对文本行需额外逻辑对齐。