像操作slice一样操作文件

疯狂一只小蚂蚁 · · 1878 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

现在有大文件,大约1GB。想打印第2w-3w字节的数据。
如果你能想到一下子比读到内存更好的办法,就不用看这篇文章了。

  • 一段不明所以的代码
  • 真正的英雄函数
  • 留下疑问
  • github 完整代码
一段不明所以的代码
func sliceFile(rs io.ReadSeeker, w io.Writer, start, end int) error {
    if start < 0 {
        return fmt.Errorf("invalid start argument: %d", start)
    }

    if end < 0 {
        return fmt.Errorf("invalid end argument: %d", end)
    }

    if end < start {
        return fmt.Errorf("invalid start:end argument: [%d, %d]", start, end)
    }

       //
    _, err := rs.Seek(int64(start), 0)
    if err != nil {
        return err
    }

    canRead := end - start

    // buf大小可以调整,为了测试方便调小一点
    readBuf := make([]byte, 8)
    for canRead > 0 {
        needRead := len(readBuf)
        if needRead > canRead {
            needRead = canRead
        }

        n, err := rs.Read(readBuf[:needRead])
        if err != nil {
            break
        }
        w.Write(readBuf[:n])
        canRead -= n
    }
    return nil
}
  
真正的英雄函数

请看第一个注释下面的函数,就是它。

疑问

普通文件用上面的函数可以使用,如果输入是os.Stdin怎么办?

github代码示例

file-slice

后记

在用golang实现linux head 和 tail命令有感而发。感兴趣的可以移步观看
coreutils这个项目,目前已经是全github最全的,用golang语言重写linux 命令项目


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:疯狂一只小蚂蚁

查看原文:像操作slice一样操作文件

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1878 次点击  
加入收藏 微博
上一篇:value.go
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传