错误:filex.LastLine 在最后一个分隔符后的内容为 1024 字节的整数倍时,返回错误的行
作者: purplecity创建于 2026年9月25日更新于 2026年9月25日
在 core/filex/file.go 中,lastLine() 以 1024 字节的块向后读取文件。在扫描块中查找 \n 之前,它无条件地删除尾部的换行符:
if buf[n-1] == '\n' {
buf = buf[:n-1]
n--
} else {
buf = buf[:n]
}此删除操作仅对尾部块(第一个读取的块)是正确的,其中尾部 \n 是文件的最后一个换行符。对于内部块,块的最后一个字节上的 \n 是最后一行的开始边界(下一个已读取的块正好在最后一行的开始处)。删除它会破坏该边界;剩余的块中不包含 \n,因此整个块(属于前一行)被前置到累积结果中:
last = append(buf, last...) // buf属于前一行,错误地合并精确的触发条件是 (fileSize - lastSeparatorOffset - 1) % 1024 == 0,即最后一行 \n 后的内容长度为 1024 的整数倍。
内容来源: zeromicro/go-zero