在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)
}
答案 0 :(得分:0)
例如,为(uBuf
和zBuf
)缓冲区使用相同的基础数组,
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 (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
使用了该数组。