Как использовать интерфейсы в Golang?

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

от hobart.rath , в категории: Golang , год назад

Как использовать интерфейсы в Golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

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

от jorge , 10 месяцев назад

@hobart.rath 

В Golang интерфейсы являются очень мощным механизмом для создания абстракций. Они позволяют определять набор методов, которые должны быть реализованы любым типом, который хочет утверждать, что он реализует этот интерфейс.


Давайте рассмотрим пример использования интерфейсов в Golang. Допустим, у нас есть два типа данных: круг и квадрат. Мы хотим создать интерфейс, который будет определять методы для получения периметра и площади фигуры.

1
2
3
4
type Shape interface {
    Perimeter() float64
    Area() float64
}


Теперь мы можем определить два типа - Circle и Square, которые реализуют этот интерфейс:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Circle struct {
    Radius float64
}

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.Radius
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

type Square struct {
    Side float64
}

func (s Square) Perimeter() float64 {
    return 4 * s.Side
}

func (s Square) Area() float64 {
    return s.Side * s.Side
}


Теперь мы можем использовать любой из этих типов данных, как если бы он был типом Shape:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func PrintPerimeterAndArea(shape Shape) {
    fmt.Println("Perimeter:", shape.Perimeter())
    fmt.Println("Area:", shape.Area())
}

func main() {
    circle := Circle{Radius: 5}
    square := Square{Side: 10}
    
    PrintPerimeterAndArea(circle)
    PrintPerimeterAndArea(square)
}


В данном примере, функция PrintPerimeterAndArea принимает аргумент типа Shape. Мы передаем ей экземпляры типов Circle и Square, которые реализуют интерфейс Shape. Таким образом, мы можем вызывать методы Perimeter() и Area() для любого типа, который реализует этот интерфейс.


Использование интерфейсов позволяет нам абстрагироваться от конкретной реализации и работать с объектами через единый набор методов. Это делает наши программы более гибкими и позволяет нам легко заменять или расширять функциональность в будущем.