我是否可以只读取文件的n个字节而不创建n大小的缓冲区?

Gre*_*gle 2 go

我正在检测非常大(30+ GB)的文件是否相同.而不是散列所有30 GB,我认为我将哈希第一兆字节,然后兆字节从10%开始进入文件,然后兆字节从20%开始进入文件,依此类推.检测1000万字节是否相同对于我的目的来说已经足够了.

在Ruby或JavaScript中,当我这样做时,我只需创建一个10 MB的缓冲区,读入1 MB,在文件中向前搜索,在缓冲区中再读取1 MB,向前搜索等,然后对缓冲区进行哈希处理.

在围棋,我有点困惑如何做到这一点,因为Read,ReadFull,ReadAtLeast等功能似乎都采取了缓存作为一个参数,然后读,直到填满它.所以我可以分配11个单独的缓冲区,用单独的1 MB块填充10个,然后将它们连接到最后一个哈希...但这似乎超级低效和浪费.我确定我错过了一些东西,但是搜索文档只会让我更加困惑.什么是Go中这个问题的合适解决方案?我可以简单地要求将n个字节读入预先存在的缓冲区吗?

Jim*_*imB 5

您可以切片[]byte传递给的缓冲区Read,或ReadFull.

"切片"切片指向相同的后备阵列,因此分配完整缓冲区,并将其切片到位:

r.Read(buf[i : i+chunkSize])
Run Code Online (Sandbox Code Playgroud)

要么

io.ReadFull(r, buf[i:i+chunkSize])
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/Uj626v-GE6