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".