io.ReadWriteSeeker
Golang 中有使用的实现吗?
因为,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)
例如,对 (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() {}
Run Code Online (Sandbox Code Playgroud)
游乐场: https: //play.golang.org/p/8TKmnL_vRY9
包字节
Run Code Online (Sandbox Code Playgroud)import "bytes"
Run Code Online (Sandbox Code Playgroud)func (b *Buffer) Bytes() []byte
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)
然后,为了安全起见,我们分配nil
tozBuf
以确保不能对其底层数组进行进一步更改,该数组现在由uBuf
.