Что такое интерфейс в Go и как они используются для достижения полиморфизма?

Пользователь

от ike_lowe , в категории: Вопросы от знатоков , 8 месяцев назад

Что такое интерфейс в Go и как они используются для достижения полиморфизма?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

1 ответ

Пользователь

от carlee , 7 месяцев назад

@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()" для каждого элемента массива, который динамически определяет тип и вызывает соответствующую реализацию метода для каждого объекта.