Há pouco tempo, comecei a aprender o Go e descobri que muitas coisas aparentemente familiares funcionam de maneira diferente. As interfaces estão entre elas. Anteriormente, eu não pensava no fato de que a digitação com patos pode estar em um idioma estaticamente tipado. Agora parece-me que isso é lógico e razoável. Aqui, descreverei uma razão que determinou amplamente minha atitude em relação às interfaces no Go.
Go é uma linguagem bastante sólida
Desculpe pelo trocadilho, não pude resistirNo tópico “Go é uma linguagem orientada a objetos?” muitos artigos são escritos, inclusive sobre Habré. Mas não tão frequentemente, quando esse tópico é abordado, eles falam sobre os princípios do SOLID e geralmente raramente sobre o último (em ordem, mas não em importância) deles - o princípio da inversão de dependência (DIP). Se esquecido, geralmente é formulado da seguinte maneira:
As abstrações não devem depender dos detalhes. Os detalhes devem depender de abstrações.
Provavelmente a ferramenta mais poderosa que foi inventada para implementar esse princípio - interfaces. Se você deseja esclarecer a inversão de dependências por conta própria,
aqui está um bom artigo . A propósito, a imagem é de lá.

Suponha que Foo e Bar estejam em módulos diferentes: F e B. Mas, para implementar a interface, devemos importar a interface IBar de F para B e, de alguma forma, transferir sua implementação de volta para F. Em certo sentido, uma dependência cíclica entre pacotes (não em termos de comportamento, mas em termos de importação). É aqui que a implementação implícita das interfaces vem em nosso auxílio. Podemos importar Bar de B para F, e o Go descobrirá se implementa IBar ou não. Nesse caso, a especificação explícita de interfaces durante a implementação se torna redundante.
Algumas palavras no final
O Interfaces in Go é uma ferramenta poderosa, inclusive para inversão de dependência. Mas você não deve criá-los para tudo, portanto, sempre que se perguntar - por que você está fazendo isso?
O que você gosta / não gosta no sistema de tipos Go?