Are you using interfaces effectively? Interfaces are one of the most powerful language features that Go provides, yet Go programmers often under-utilize existing interfaces in their code. Even many advanced Gophers rarely write their own interfaces, or write interfaces that are less powerful than they could be.
Let's demystify interfaces by taking a behind-the-scenes look at the two most ubiquitous interfaces of them all: the humble "io.Reader" and "error". What makes these interfaces so versatile and powerful? And how can we design our own interfaces to be as powerful as these?