如果有其他人需要处理类似的问题,这是我最终得出的结果。虽然不完整,但对于我所需的功能足够了:
package filebuffer
import (
"bytes"
"errors"
)
type FileBuffer struct {
Buffer bytes.Buffer
Index int64
}
func NewFileBuffer() FileBuffer {
return FileBuffer{}
}
func (fbuffer *FileBuffer) Bytes() []byte {
return fbuffer.Buffer.Bytes()
}
func (fbuffer *FileBuffer) Read(p []byte) (int, error) {
n, err := bytes.NewBuffer(fbuffer.Buffer.Bytes()[fbuffer.Index:]).Read(p)
if err == nil {
if fbuffer.Index+int64(len(p)) < int64(fbuffer.Buffer.Len()) {
fbuffer.Index += int64(len(p))
} else {
fbuffer.Index = int64(fbuffer.Buffer.Len())
}
}
return n, err
}
func (fbuffer *FileBuffer) Write(p []byte) (int, error) {
n, err := fbuffer.Buffer.Write(p)
if err == nil {
fbuffer.Index = int64(fbuffer.Buffer.Len())
}
return n, err
}
func (fbuffer *FileBuffer) Seek(offset int64, whence int) (int64, error) {
var err error
var Index int64 = 0
switch whence {
case 0:
if offset >= int64(fbuffer.Buffer.Len()) || offset < 0 {
err = errors.New("Invalid Offset.")
} else {
fbuffer.Index = offset
Index = offset
}
default:
err = errors.New("Unsupported Seek Method.")
}
return Index, err
}
你可以像这样使用它:
destination := filebuffer.NewFileBuffer()
source, err := os.Open(pathString)
if err != nil {
return nil, err
}
defer source.Close()
if _, err := encrypter.Decrypt(source, &destination, password); err != nil {
return nil, err
}
bytes.Buffer
包可以处理它,但显然不行。在Google小组中搜索有关seeker和bytes的帖子。所以,如果你真的需要它,你可能需要将其包装在实现Seek
的东西中。 - Eve Freemanbytes.Buffer
支持,并实现了一些接口,例如io.Reader
,io.Seeker
,io.ReaderAt
和io.Writer
等等。这个软件包的主要目的是在数据不需要持久化时,避免使用文件(临时或非临时)。以下是该软件包的链接:https://github.com/mattetti/filebuffer。 - Matt Aimonettiio.ReadSeeker
,那么bytes.NewReader
可能正是你所需要的。 - quant2016