Stephen Mwangi
Selected Go Interfaces
This is a collection of Go interfaces I’ve found myself using or encountering frequently while writing Go. They represent core functionality like error handling, I/O operations, data encoding/decoding, and HTTP handling.
Built-in
Go has a built-in interface for representing errors:
// error is Go's built-in interface for representing errors
type error interface {
// Error returns a human-readable error message
Error() string
}
fmt
The fmt
package provides formatted I/O operations:
// Stringer allows types to define their default string representation
// Used when printing values or converting them to strings
// Example: custom types that need a readable format
type Stringer interface {
String() string
}
// GoStringer defines how a type should be represented in Go syntax
// Used with the %#v format verb in fmt functions
// Example: useful for debugging
type GoStringer interface {
GoString() string
}
encoding/json
The encoding/json
package implements encoding and decoding of JSON:
// Marshaler lets types control their JSON encoding
// Useful when you need custom JSON formatting
// Example: converting complex types
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
// Unmarshaler lets types control their JSON decoding
// Useful for custom parsing of JSON data
// Example: parsing complex data structures
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
encoding
The encoding
package defines interfaces shared by other packages that
convert data to and from byte-level and textual representations:
// BinaryMarshaler allows types to convert themselves to binary format
// Useful for serialization and data storage
type BinaryMarshaler interface {
MarshalBinary() (data []byte, err error)
}
// BinaryUnmarshaler allows types to restore themselves from binary format
// Paired with BinaryMarshaler for complete serialization support
type BinaryUnmarshaler interface {
UnmarshalBinary(data []byte) error
}
// TextMarshaler allows types to convert themselves to text format
// Useful for human-readable serialization
type TextMarshaler interface {
MarshalText() (text []byte, err error)
}
// TextUnmarshaler allows types to restore themselves from text format
// Paired with TextMarshaler for complete text-based serialization
type TextUnmarshaler interface {
UnmarshalText(text []byte) error
}
io
The io
package provides basic interfaces to I/O primitives:
// Reader represents anything that can be read from
// Examples: files, network connections, buffer
type Reader interface {
// Read fills the provided byte slice and returns how many bytes were read
Read(p []byte) (n int, err error)
}
// Writer represents anything that can be written to
// Examples: files, network connections, buffers
type Writer interface {
// Write takes a byte slice and returns how many bytes were written
Write(p []byte) (n int, err error)
}
// Closer represents resources that need to be cleaned up
// Examples: file handles, network connections, database connections
type Closer interface {
Close() error
}
// ReadWriter combines reading and writing capabilities
type ReadWriter interface {
Reader
Writer
}
// ReadWriteCloser combines reading, writing, and cleanup capabilities
type ReadWriteCloser interface {
Reader
Writer
Closer
}
context
The context
package provides a standard way to carry deadlines, cancellation signals, and request-scoped values:
// Context carries deadlines, cancellation signals, and request-scoped values
// Used to control operations across API boundaries and goroutines
// Examples: HTTP requests, database operations, RPC calls
type Context interface {
// Deadline returns the time when work done on behalf of this context
// should be canceled
Deadline() (deadline time.Time, ok bool)
// Done returns a channel that's closed when work done on behalf of this
// context should be canceled
Done() <-chan struct{}
// Err explains why this context was cancelled
// Returns nil if not cancelled
Err() error
// Value returns the value associated with this context for key, or nil
Value(key interface{}) interface{}
}
sort
The sort
package provides primitives for sorting slices and user-defined collections:
// Interface defines how to sort any collection
// Implement these methods to make your collection sortable
// The standard library's sort package will handle the actual sorting
type Interface interface {
// Len returns the total number of elements
Len() int
// Less determines the ordering between elements
// Return true if element i should come before element j
Less(i, j int) bool
// Swap swaps elements at positions i and j
Swap(i, j int)
}
net/http
The net/http
package provides HTTP client and server implementations:
// Handler processes HTTP requests
// It's the foundation of Go's HTTP server functionality
// Implement this to create custom HTTP endpoints
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
// ResponseWriter lets you construct HTTP responses
// Used to send headers, write response body, and set status codes
type ResponseWriter interface {
// Header returns the header map that will be sent by WriteHeader
Header() Header
// Write writes the data to the connection as part of a HTTP reply
Write([]byte) (int, error)
// WriteHeader sends an HTTP response header with the provided
// status code
WriteHeader(statusCode int)
}
database/sql
The database/sql
package provides a generic interface around SQL (or SQL-like) databases:
// Scanner converts database values into Go values
// Used when reading data from databases
// Handles common database types like integers, strings, and timestamps
type Scanner interface {
Scan(src interface{}) error
}
// Valuer converts Go values into database values
// Used when writing data to databases
// Ensures proper type conversion for database storage
type Valuer interface {
Value() (Value, error)
}