在golang中实现io.ReadWriteSeeker

时间:2018-03-25 14:51:36

标签: go buffer seek

在Golang中是否有io.ReadWriteSeeker的实现?

因为bytes.Buffer没有实现Seek方法,所以我需要找到这样一个实现来用作zipwriter编写的缓冲区,并通过搜索来读取。

此外,我不会使用Reader(buff.Bytes())来隐藏内存副本,因为我无法承受缓冲数据的双倍内存大小。

此外,当使用os.File作为选项时,如果我不打电话给f.Sync,它将永远不会触及文件系统,对吧?感谢。

我的简化代码:

func process() {
  buff := new(bytes.Buffer)
  zipWriter := zip.NewWriter(buff)
  // here to add data into zipWriter in sequence
  zipWriter.Close()
  upload(buff) // upload(io.ReadSeeker)
}

1 个答案:

答案 0 :(得分:0)

例如,为(uBufzBuf)缓冲区使用相同的基础数组,

package main

import (
    "archive/zip"
    "bytes"
    "io"
)

func upload(io.ReadSeeker) {}

func process() {
    zBuf := new(bytes.Buffer)
    zipWriter := zip.NewWriter(zBuf)
    // add data into zipWriter in sequence
    zipWriter.Close()
    uBuf, zBuf := zBuf.Bytes(), nil
    // upload(io.ReadSeeker)
    upload(bytes.NewReader(uBuf))
}

func main() {}

游乐场:https://play.golang.org/p/8TKmnL_vRY9

  

包字节

import "bytes" 
     

func (*Buffer) Bytes

func (b *Buffer) Bytes() []byte
     

字节返回一个长度为b.Len()的片段,其中包含未读部分   缓冲区。切片仅在下一个缓冲区使用时有效   修改(也就是说,直到下次调用Read之类的方法,   写入,重置或截断)。切片将缓冲区内容别名为   至少到下一次缓冲区修改,所以立即改变了   切片会影响将来读取的结果。

元组赋值语句

    uBuf, zBuf := zBuf.Bytes(), nil

获取压缩字节(zBuf.Bytes())的切片描述符,并将其分配给切片描述符uBuf。切片描述符是struct,具有指向底层数组的指针,切片长度和切片容量。例如,

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

然后,为了安全起见,我们将nil分配给zBuf,以确保不会对其基础数组进行进一步更改,现在uBuf使用了该数组。