@ike_lowe
В Go интерфейс представляет абстракцию, определяющую набор методов без конкретной реализации. Интерфейсы в Go позволяют достичь полиморфизма, так как позволяют обрабатывать объекты разных типов через общий интерфейс.
В Go интерфейс определяется с помощью ключевого слова "interface" и указывается набор методов, которые должны быть реализованы для типа, чтобы он удовлетворял данному интерфейсу. Интерфейс может получать методы как отдельно, так и вместе с реализацией.
Когда тип реализует все методы, необходимые для интерфейса, а его название и пакет соответствуют названию и пакету интерфейса соответственно, то Go автоматически считает тип реализующим данный интерфейс. Также в Go имеется возможность реализовать интерфейс явно указывая его название при объявлении структуры.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Определение интерфейса type Shape interface { Area() float64 } // Реализация интерфейса для типа Circle type Circle struct { radius float64 } func (c Circle) Area() float64 { return math.Pi * c.radius * c.radius } // Реализация интерфейса для типа Rectangle type Rectangle struct { width, height float64 } func (r Rectangle) Area() float64 { return r.width * r.height } func main() { circle := Circle{radius: 5} rectangle := Rectangle{width: 4, height: 3} // Использование полиморфизма через интерфейс shapes := []Shape{circle, rectangle} for _, shape := range shapes { fmt.Println(shape.Area()) } } |
В данном примере определяется интерфейс "Shape" с методом "Area()", который возвращает площадь фигуры. Затем реализуются две структуры "Circle" и "Rectangle", оба типа реализуют метод "Area()", необходимый для удовлетворения интерфейса "Shape".
В функции "main()" создаются экземпляры объектов "Circle" и "Rectangle". Затем они добавляются в массив "shapes", имеющий тип интерфейса "Shape". В цикле происходит вызов метода "Area()" для каждого элемента массива, который динамически определяет тип и вызывает соответствующую реализацию метода для каждого объекта.