【问题标题】:Implementation of io.ReadWriteSeeker in golanggolang中io.ReadWriteSeeker的实现
【发布时间】:2018-03-25 14:51:35
【问题描述】:

在 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)
}

【问题讨论】:

  • bytes.Buffer.Bytes 不复制字节。 bytes.Reader 实现了 io.Reader 和 io.Seeker。您确定需要一种类型的所有接口吗?我只能从头顶想到 os.File。
  • 似乎在使用 Reader(buff.Bytes()) 时占用了太多内存,可能是由于字节片要堆叠造成的。是的,我想我必须使用这种类型,因为我买不起在 Writer 和 ReadSeeker 之间转换的内存。
  • ReadSeeker 必然需要所有数据的副本。否则不可能找到开头和/或结尾。
  • 嗨彼得,我的情况是数据缓冲后不再写入,所以在读取之前是完整的副本。
  • 现在我更不明白为什么您需要单一类型的所有内容。最好包含遇到问题的代码。而且,再次, bytes.NewReader(buff.Bytes()) 不会复制任何字节。

标签: go buffer seek


【解决方案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() {}

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


包字节

import "bytes" 

func (*Buffer) Bytes

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

Bytes 返回一个长度为 b.Len() 的切片,其中包含未读部分 缓冲区。切片仅在下一个缓冲区之前有效 修改(即,仅在下一次调用 Read 等方法之前, 写入、重置或截断)。切片将缓冲区内容别名为 至少直到下一次缓冲区修改,所以立即更改 slice 会影响以后读取的结果。

元组赋值语句

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

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

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

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

【讨论】:

  • 嗨,彼得,感谢您的完美回答,我只是注意到切片是引用类型而不是数组,所以通过它很便宜。此外,为了安全起见,最好将 zBuf 设置为 nil。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多