Go got this right: small interfaces, no inheritance.

A type satisfies an interface by having the methods. No "implements" keyword. No taxonomy to maintain. The interface is just a contract, defined where it's used.

This means interfaces stay tiny — usually 1 or 2 methods — because nobody is tempted to bundle unrelated concerns into a base class.

The result: composition wins. Code is easier to test because the seams are everywhere.

See: [[go-concurrency-patterns]], [[@dave/on-abstraction]]