Close the open file object inside ReadSeeker
diff --git a/go/pkg/reader/reader.go b/go/pkg/reader/reader.go
index bbdcbca..57acec5 100644
--- a/go/pkg/reader/reader.go
+++ b/go/pkg/reader/reader.go
@@ -6,6 +6,7 @@
 	"fmt"
 	"io"
 	"os"
+	"sync"
 )
 
 type Initializable interface {
@@ -17,6 +18,7 @@
 	io.Reader
 	Initializable
 	SeekOffset(offset int64)
+	Close() error
 }
 
 type fileSeeker struct {
@@ -27,6 +29,8 @@
 	buffSize    int
 	seekOffset  int64
 	initialized bool
+
+	mu sync.Mutex
 }
 
 // NewFileReadSeeker wraps a buffered file reader with Seeking functionality.
@@ -54,6 +58,9 @@
 // Seek is a simplified version of io.Seeker. It only supports offsets from the
 // beginning of the file, and it errors lazily at the next Initialize.
 func (fio *fileSeeker) SeekOffset(offset int64) {
+	fio.mu.Lock()
+	defer fio.mu.Unlock()
+
 	fio.seekOffset = offset
 	fio.initialized = false
 	fio.reader = nil
@@ -62,11 +69,17 @@
 // IsInitialized indicates whether this reader is ready. If false, Read calls
 // will fail.
 func (fio *fileSeeker) IsInitialized() bool {
+	fio.mu.Lock()
+	defer fio.mu.Unlock()
+
 	return fio.initialized
 }
 
 // Initialize does the required IO pre-work for Read calls to function.
 func (fio *fileSeeker) Initialize() error {
+	fio.mu.Lock()
+	defer fio.mu.Unlock()
+
 	if fio.initialized {
 		return errors.New("Already initialized")
 	}
@@ -95,3 +108,18 @@
 	fio.initialized = true
 	return nil
 }
+
+// Close closes the open file handle if it hasn't been closed yet.
+func (fio *fileSeeker) Close() error {
+	fio.mu.Lock()
+	defer fio.mu.Unlock()
+
+	if fio.f == nil {
+		return nil
+	}
+	if err := fio.f.Close(); err != nil {
+		return fio.f.Close()
+	}
+	fio.initialized = false
+	return nil
+}
diff --git a/go/pkg/reader/reader_test.go b/go/pkg/reader/reader_test.go
index 5dfba4e..ef93632 100644
--- a/go/pkg/reader/reader_test.go
+++ b/go/pkg/reader/reader_test.go
@@ -47,6 +47,7 @@
 			data := make([]byte, tc.dataBuffSize)
 
 			r := NewFileReadSeeker(path, tc.IOBuffSize)
+			defer r.Close()
 			if _, err := r.Read(data); err == nil {
 				t.Errorf("Read() = should have err'd on unitialized reader")
 			}
@@ -100,6 +101,7 @@
 	}
 
 	r := NewFileReadSeeker(path, 10)
+	defer r.Close()
 	// Past Offset
 	r.SeekOffset(10)
 	if err := r.Initialize(); err != nil {