👣 Вопрос с собеседования: зачем нужны интерфейсы в Go?



Интерфейсы в Go — это способ реализации полиморфизма



Проиллюстрировать интерфейсы можно так:

package main



import (

"math"

"fmt"

)



// Круг.

type Circle struct {

x, y, r float64

}



// Прямоугольник.

type Rectangle struct {

x1, y1, x2, y2 float64

}



// Интерфейс фигуры, которому удовлетворяют все типы, имеющие соответствующий

// метод вычисления площади Area().

type Figure interface {

Area() float64

}



// Реализация интерфейса Figure для Circle.

func (c *Circle) Area() float64 {

return math.Pi * c.r * c.r

}



// Реализация интерфейса Figure для Rectangular.

func (r *Rectangle) Area() float64 {

return math.Abs(r.x2 - r.x1) * math.Abs(r.y2 - r.y1)

}



func main() {

figures := make([]Figure, 0) // Срез фигур.



// Мы можем добавлять в этот срез все, что удовлетворяет интерфейсу

// Figure, несмотря на то, что это элементы разных типов:

figures = append(figures, &Circle{0, 0, 10})

figures = append(figures, &Rectangle{0, 0, 10, 20})



// И теперь мы можем единообразно обрабатывать эти данные разных типов.

for _, figure := range figures {

fmt.Printf("Area of %#v = %f\n", figure, figure.Area())

}

}




Результат:

$ go run figures.go

Area of &main.Circle{x:0, y:0, r:10} = 314.159265

Area of &main.Rectangle{x1:0, y1:0, x2:10, y2:20} = 200.000000




@golang_interview