У підручнику Go 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 #?