Implement WriterTo
Avoids allocation/copy when writing byteview to a writer.
diff --git a/byteview.go b/byteview.go
index 035a9ee..a2c2c49 100644
--- a/byteview.go
+++ b/byteview.go
@@ -158,3 +158,18 @@
}
return
}
+
+// WriteTo implements io.WriterTo on the bytes in v.
+func (v ByteView) WriteTo(w io.Writer) (n int64, err error) {
+ var m int
+ if v.b != nil {
+ m, err = w.Write(v.b)
+ } else {
+ m, err = io.WriteString(w, v.s)
+ }
+ if err == nil && m < v.Len() {
+ err = io.ErrShortWrite
+ }
+ n = int64(m)
+ return
+}
diff --git a/byteview_test.go b/byteview_test.go
index 9ece00f..a09757a 100644
--- a/byteview_test.go
+++ b/byteview_test.go
@@ -17,6 +17,7 @@
package groupcache
import (
+ "bytes"
"fmt"
"io"
"io/ioutil"
@@ -47,6 +48,10 @@
if got, err := ioutil.ReadAll(io.NewSectionReader(v, 0, int64(len(s)))); err != nil || string(got) != s {
t.Errorf("%s: SectionReader of ReaderAt = %q, %v; want %q", name, got, err, s)
}
+ var dest bytes.Buffer
+ if _, err := v.WriteTo(&dest); err != nil || !bytes.Equal(dest.Bytes(), []byte(s)) {
+ t.Errorf("%s: WriteTo = %q, %v; want %q", name, dest.Bytes(), err, s)
+ }
}
}
}