Uma interface é um contrato: um conjunto de métodos que um tipo promete ter. Quem usa a interface só conhece o contrato, não a implementação, e por isso dá para trocar a implementação sem mexer em quem usa.
Em Java: explícita (nominal)
A classe precisa declarar que implementa a interface:
interface Shape { double area();}
record Circle(double r) implements Shape { public double area() { return Math.PI * r * r; }}Em Go: implícita (estrutural)
Não existe implements. Se o tipo tem os métodos, ele satisfaz a interface automaticamente:
type Shape interface { Area() float64}
type Circle struct{ R float64 }
func (c Circle) Area() float64 { return math.Pi * c.R * c.R } // Circle já é um ShapeIsso permite definir a interface onde ela é usada, e não onde o tipo é criado. A convenção em Go é ter interfaces pequenas, de um ou dois métodos (io.Reader, io.Writer, fmt.Stringer).
Para que servem na prática
- Trocar implementações: o mesmo código funciona com Stripe ou Pix.
- Testar: nos testes, uma implementação falsa no lugar do serviço real.
- Desacoplar camadas: o domínio define a interface e a infraestrutura implementa (é a ideia central da arquitetura hexagonal).
Veja também: Structs e interfaces em Go e Paradigmas.