Skip to content
Go back

Go Interface Elegance

  1. at first, generic interface definitions [from io pkg]

    type Reader interface {
      Read(p []byte) (n int, err error)
    }
    
    type Writer interface {
      Write(p []byte) (n int, err error)
    }
    
    type Seeker interface {
      Seek(offset int64, whence int) (int64, error)
    }
    
    type Closer interface {
      Close() error
    }
  2. interface compositions

    type ReadWriter interface {
      Reader
      Writer
    }
    
    type ReadSeeker interface {
      Reader
      Seeker
    }
    
    type ReadCloser interface {
      Reader
      Closer
    }
    
    type WriteSeeker interface {
      Writer
      Seeker
    }
    
    type WriteCloser interface {
      Writer
      Closer
    }
    
    type ReadWriteSeeker interface {
      Reader
      Writer
      Seeker
    }
    
    type ReadWriteCloser interface {
      Reader
      Writer
      Closer
    }
  3. implement the interface’s function

    type StructA struct {
    }
    
    func (p *StructA) Read(p []byte) (n int, err error) {
    }
    
    func (p *StructA) Write(p []byte) (n int, err error) {
    }
    
    func (p *StructA) Seek(offset int64, whence int) (int64, error){
    }
    
    type StructB struct {
    }
    
    func (p *StructB) Read(p []byte) (n int, err error) {
    }
    
    func (p *StructB) Write(p []byte) (n int, err error) {
    }
    
    func (p *StructB) Close() error {
    }

    struct StructA has implemented interfaces

    • Reader
    • Writer
    • Seeker
    • ReadWriter
    • ReadSeeker
    • WriteSeeker
    • ReadWriteSeeker

    struct StructA can work as a parameter on below functions

    func Func(p *Reader) (int, error);
    func Func(p *Writer) (int, error);
    func Func(p *Seeker) (int, error);
    func Func(p *ReadWriter) (int, error);
    func Func(p *ReadSeeker) (int, error);
    func Func(p *WriteSeeker) (int, error);
    func Func(p *ReadWriteSeeker) (int, error);

    struct StructB has implemented interfaces

    • Reader
    • Writer
    • Closer
    • ReadWriter
    • ReadCloser
    • WriteCloser
    • ReadWriteCloser

    struct StructB can work as a parameter on below functions

    func Func(p *Reader) (int, error);
    func Func(p *Writer) (int, error);
    func Func(p *Closer) (int, error);
    func Func(p *ReadWriter) (int, error);
    func Func(p *ReadCloser) (int, error);
    func Func(p *WriteCloser) (int, error);
    func Func(p *ReadWriteCloser) (int, error);
  4. easy to add functions to implement new interface with same signatures.

KISS and DRY.


Share this post on:

Previous Post
潘家园偶遇
Next Post
Retired, New Balance