The SeekableBuffer type is similar to a bytes.Buffer in that you can perform both reads and writes against it, but has the following two main differences:
- You can seek on it.
- After writing to it, the current position will be on the byte following whatever you wrote. This is the typical behavior for a file resource on almost any platform but not for a
bytes.Buffer.
Eccentric usage of seek, read, and write behavior, such as the following, will work as expected:
- seeking but not writing
- seeking past the end of the file and writing
- seeking past the end of the file and reading
- writing N+M bytes when positioned only N bytes from the end of the file
Usage (from the unit-tests):
sb := NewSeekableBuffer()
// Write first string.
data := []byte("word1-word2")
_, err := sb.Write(data)
log.PanicIf(err)
// Seek and replace partway through, and replace more data than we
// currently have.
_, err = sb.Seek(6, os.SEEK_SET)
log.PanicIf(err)
data2 := []byte("word3-word4")
_, err = sb.Write(data2)
log.PanicIf(err)
// Read contents.
_, err = sb.Seek(0, os.SEEK_SET)
log.PanicIf(err)
buffer := make([]byte, 20)
_, err = sb.Read(buffer)
log.PanicIf(err)
// `buffer` currently has "word1-word3-word4".