modulepackage
0.0.0-20171115124131-a17c8cb89270
Repository: https://github.com/avvmoto/buf-readerat.git
Documentation: pkg.go.dev
# README
buf-readerat
Package buf-readerat implements buffered io.ReaderAt. It wraps an io.ReaderAt object, creating another io.ReaderAt object that also implements the interface but provides buffering.
This package is especially useful for packages those who require io.ReaderAt for initialize, like zip.Reader.
Installation
go get github.com/avvmoto/buf-readerat
Usage
Use BufReaderAt
r := bytes.NewReader([]byte("123456789"))
bra := bufra.NewBufReaderAt(r, 8)
buf := make([]byte, 4)
if _, err := bra.ReadAt(buf, 4); err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", buf)
Use Zip file on Google Cloud Storage within Google App Engine
import "cloud.google.com/go/storage"
// wrap storage.NewRangeReader to use as io.ReaderAt
type rowGCSReaderAt struct {
ctx context.Context
obj *storage.ObjectHandle
}
func newRowGCSReaderAt(ctx context.Context, obj *storage.ObjectHandle) *rowGCSReaderAt {
return &rowGCSReaderAt{
ctx: ctx,
obj: obj,
}
}
// Wrap NewRangeReader
func (ra *rowGCSReaderAt) ReadAt(b []byte, off int64) (n int, err error) {
if ra == nil {
return 0, errors.New("invalid")
}
rc, err := ra.obj.NewRangeReader(ra.ctx, off, int64(len(b)))
if err != nil {
return
}
defer rc.Close()
n, err = rc.Read(b)
return
}
type GCSReaderAt struct {
cache *BufReaderAt
}
func NewGCSReaderAt(ctx context.Context, obj *storage.ObjectHandle) (*GCSReaderAt) {
rowReaderAt := newRowGCSReaderAt(ctx, obj)
cra := NewBufReaderAt(rowReaderAt, cacheSize)
return &GCSReaderAt{
cache: cra,
}
}
func (ra *GCSReaderAt) ReadAt(b []byte, off int64) (n int, err error) {
return ra.cache.ReadAt(b, off)
}
License
Copyright (c) 2016-present avvmoto
Licensed under MIT License
# Functions
NewBufReaderAt returns a new BufReaderAt whose buffer has the specified size.
# Structs
BufReaderAt implements buffering for an io.ReaderAt object.