~/Go Reader and Writer Interfaces Explained with Code
May 14, 2021
Gos Reader and Writer interfaces standardize streaming data operations. The Reader
interface requires a Read(p []byte) (n int, err error)
method. The Writer
interface requires a Write(p []byte) (n int, err error)
method.
Code Example 1: Implement the Reader interface
1
2
3
4
5
6
7
8
|
type MyReader struct{}
func (m MyReader) Read(p []byte) (int, error) {
copy(p, "abc")
return 3, io.EOF
}
var r io.Reader = MyReader{}
buf := make([]byte, 10)
n, err := r.Read(buf)
|
Code Example 2: Implement the Writer interface
1
2
3
4
5
6
7
|
type MyWriter struct{}
func (m MyWriter) Write(p []byte) (int, error) {
fmt.Print(string(p))
return len(p), nil
}
var w io.Writer = MyWriter{}
w.Write([]byte("hello"))
|
Code Example 3: Using the built-in strings.Reader
1
2
3
4
|
r := strings.NewReader("golang")
buf := make([]byte, 4)
n, _ := r.Read(buf)
// buf now contains "gola"
|
Code Example 4: Use bytes.Buffer as both Reader and Writer
1
2
3
4
5
|
var buf bytes.Buffer
buf.Write([]byte("abc"))
output := make([]byte, 2)
n, _ := buf.Read(output)
// output now contains "ab"
|
Code Example 5: Copy from Reader to Writer
1
2
3
4
|
src := strings.NewReader("1234")
dst := &bytes.Buffer{}
io.Copy(dst, src)
// dst.String() is "1234"
|
These interfaces are fundamental for I/O in Go. For more details, see the Go io package.