Search code examples
file-iogobuffer

io.WriteSeeker and io.ReadSeeker from []byte or file


I have a method called "DoSomething". DoSomething will take binary source data perform an operation on it, and write out binary data. DoSomething needs to be generic enough to handle either a []byte array or a file handle for both the source and destination. To accomplish this, I have attempted to declare the method like this:

func DoSomething(source *io.ReadSeeker, destination *io.WriteSeeker)

I have implemented the ReadSeeker and WriteSeeker for working with buffers, using my own custom, required methods (if there is a way to automatically accomplish this, I'd love to hear about it as well). Unfortunately, I can't seem to figure out how to create either an io.ReadSeeker or io.WriteSeeker from a file handle. I'm fairly sure there must be some pre-cooked way of handling this without having to manually implement them. Is this possible?


Solution

  • A file already implements both of those. You can do something like this:

    package main
    
    import (
       "fmt"
       "io"
       "os"
    )
    
    func main() {
       f, err := os.Open("test.txt")
       if err != nil {
         fmt.Println(err)
       }
       defer f.Close()
       f2, err := os.Create("test2.txt")
       if err != nil {
          fmt.Println(err)
       }
       defer f2.Close()
       DoSomething(f, f2) 
    }
    
    func DoSomething(source io.ReadSeeker, destination io.WriteSeeker) {
       io.Copy(destination, source)
    }
    

    Also, you don't need to pass pointers to interfaces, which makes it easier to deal with them.