對於任何需要完成這樣的事情的人來說,這就是我最終的結果。這是不完整的,但它是我所需要的足夠接近:
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
}
謝謝!這應該是顯而易見的。 我可以在沒有手動實現所有方法的情況下從[]字節緩衝區創建ReadSeeker/WriteSeeker嗎? – shellster
我以爲'bytes.Buffer'包會處理它,但顯然不是。在搜索引擎和字節上搜索谷歌組的帖子。所以,是的,如果你真的需要,你可能需要將它包裝在實現「Seek」的東西中。 –
我寫了一個完全符合你要求的包。新的結構由'bytes.Buffer'支持並實現'io.Reader','io.Seeker','io.ReaderAt','io.Writer'等。pkg的主要目的是避免在數據不需要保存時使用文件(臨時或不臨時)。這是pkg:https://github.com/mattetti/filebuffer –