В руководстве по языку Go они объясняют, как работают интерфейсы:
Сразу нет классов. Однако вы можете определить методы для структурных типов. Приемник метода появляется в своем списке аргументов между Func ключевым словом и именем метода.
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
Тип интерфейса определяется набором методов. Значение типа интерфейса может содержать любое значение, которое реализует эти методы.
Это единственный способ создать интерфейс в Go. Google далее объясняет, что:
Тип реализует интерфейс путем реализации методов. Нет явного объявления о намерениях [т.е.
interface
объявлений].Неявные интерфейсы отделяют пакеты реализации от пакетов, которые определяют интерфейсы: ни один не зависит от другого.
Это также поощряет определение точных интерфейсов, потому что вам не нужно искать каждую реализацию и помечать ее новым именем интерфейса.
Все это звучит подозрительно как методы расширения в C # , за исключением того, что методы в Go беспощадно полиморфны; они будут работать с любым типом, который их реализует.
Google утверждает, что это способствует быстрому развитию, но почему? Вы отказываетесь от чего-то, уходя от явных интерфейсов в C #? Могут ли методы расширения в C # позволить извлечь некоторые из преимуществ интерфейсов Go в C #?