golang中io.ReadWriteSeeker的实现

Ste*_*Liu 5 buffer go seek

io.ReadWriteSeekerGolang 中有使用的实现吗?

因为,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)
}
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 1

例如,对 (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() {}
Run Code Online (Sandbox Code Playgroud)

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


包字节

import "bytes" 
Run Code Online (Sandbox Code Playgroud)

func (*Buffer) 字节

func (b *Buffer) Bytes() []byte
Run Code Online (Sandbox Code Playgroud)

Bytes 返回长度为 b.Len() 的切片,其中保存缓冲区的未读部分。该切片仅在下一次缓冲区修改之前有效(即,仅在下一次调用 Read、Write、Reset 或 Truncate 等方法之前)。切片至少在下一次缓冲区修改之前对缓冲区内容进行别名,因此对切片的立即更改将影响将来读取的结果。

元组赋值语句

    uBuf, zBuf := zBuf.Bytes(), nil
Run Code Online (Sandbox Code Playgroud)

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

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
Run Code Online (Sandbox Code Playgroud)

然后,为了安全起见,我们分配niltozBuf以确保不能对其底层数组进行进一步更改,该数组现在由uBuf.