gpt4 book ai didi

go - golang中io.ReadWriteSeeker的实现

转载 作者:IT王子 更新时间:2023-10-29 02:21:04 26 4
gpt4 key购买 nike

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

最佳答案

例如,对 (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() {}

Playground :https://play.golang.org/p/8TKmnL_vRY9


Package bytes

import "bytes" 

func (*Buffer) Bytes

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

Bytes returns a slice of length b.Len() holding the unread portion of the buffer. The slice is valid for use only until the next buffer modification (that is, only until the next call to a method like Read, Write, Reset, or Truncate). The slice aliases the buffer content at least until the next buffer modification, so immediate changes to the slice will affect the result of future reads.

元组赋值语句

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

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

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

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

关于go - golang中io.ReadWriteSeeker的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49477155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com