Во-первых, важно отметить, что типы реализуют интерфейсы неявно , то есть интерфейсы являются "типами утки". Любой тип, который предоставляет методы, требуемые интерфейсом, может быть назначен переменной типа интерфейса без какого-либо взаимодействия с исходным типом. Это отличается от, скажем, Java или C #, где класс, реализующий интерфейс, должен объявить свое намерение реализовать интерфейс, в дополнение к фактическому предоставлению методов.
Го также имеет довольно сильную тенденцию против "действия на расстоянии". Например, хотя методы объявляются отдельно от типов, нельзя объявлять метод в пакете, отличном от типа его получателя. Вы не можете просто добавить методы к os.File
.
Если интерфейсы могут предоставлять методы (делая их черты / роли ), то любой тип, который реализует интерфейс, получит кучу новых методов из ниоткуда. Кто-то, читающий код и видящий эти методы, вероятно, имеет трудно понять, откуда они пришли.
Существует проблема с хрупкостью - измените сигнатуру метода, который требуется интерфейсу, и куча других методов появляются или исчезают. В случае, когда они исчезли, не очевидно, откуда они «взялись». Если типы должны были объявить о своем намерении реализовать интерфейс, то нарушение контракта вызовет ошибку (а «случайная» реализация интерфейса ничего не даст), но когда интерфейсы удовлетворяются неявным образом, все становится сложнее.
Хуже того, могут быть конфликты имен - интерфейс предоставляет метод с тем же именем, что и метод, предоставленный типом, реализующим этот интерфейс, или два интерфейса предоставляют метод с одинаковым именем, и некоторый тип реализуется оба этих интерфейса. Разрешение этого конфликта - это та сложность, которой Го действительно нравится избегать, и во многих случаях не является неудовлетворительным разрешением.
По сути, было бы действительно здорово, если бы интерфейсы могли предоставлять методы - роли как составные единицы поведения - это круто и хорошо сочетались бы с философией компоновки-наследования Go - но на самом деле делать это было бы слишком сложно и слишком действенно. -a-distance-y для Go, чтобы созерцать.