file.go
<p>[TOC]</p>
<h3>简要描述</h3>
<p>文件相关接口,完成如下任务:</p>
<ul>
<li>从指定的行开始读取一个文件的数据。</li>
</ul>
<h3>函数接口列表</h3>
<ul>
<li><code>func ScanFileLines(filePath string, startN int64) ([][]byte, bool, error)</code></li>
</ul>
<h3><code>ScanFileLines</code> 函数接口</h3>
<h5>函数参数介绍</h5>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">filePath</td>
<td style="text-align: left;">string</td>
<td>待读取的文件路径</td>
</tr>
<tr>
<td style="text-align: left;">startN</td>
<td style="text-align: left;">int64</td>
<td>读取文件的起始行</td>
</tr>
</tbody>
</table>
<h5>返回值介绍</h5>
<table>
<thead>
<tr>
<th style="text-align: left;">返回值名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">lines</td>
<td style="text-align: left;">[][]byte</td>
<td>读取到的数据行</td>
</tr>
<tr>
<td style="text-align: left;">eof</td>
<td style="text-align: left;">bool</td>
<td>当前文件是否到达 eof,这里是自定义的 eof。true,指的是当天的日志输出结束,需要切换到读取下一天的日志</td>
</tr>
<tr>
<td style="text-align: left;">err</td>
<td style="text-align: left;">error</td>
<td>返回的错误</td>
</tr>
</tbody>
</table>
<h5>调用逻辑</h5>
<ul>
<li>如果当前 startN 超出了文件当前行数,但是没有 eof,则直接返回。</li>
<li>如果当前 startN 超出了文件当前行数,但是已经 eof,则直接返回。</li>
<li>如果当前 startN 没有超出文件当前行数,则从 startN 开始读数据,直到遇到 eof 或者到达文件结尾,直接返回。</li>
</ul>
<h5>注意事项</h5>
<ul>
<li>目前 ScanFileLines 的实现方式,能够适配数据行很长的情况,并且支持读取容器外部映射的文件。</li>
<li>以前采用的 Scan 实现方式不支持数据行超过一定长度情况;而 mmap 实现方式不支持读取容器外部映射文件。</li>
</ul>