linux编写slice文件,像操作slice一样操作文件

现在有大文件,大约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代码示例

后记

在用golang实现linux head 和 tail命令有感而发。感兴趣的可以移步观看

coreutils这个项目,目前已经是全github最全的,用golang语言重写linux 命令项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值