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

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

от dorothea_stoltenberg , в категории: Golang , 8 месяцев назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

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

от catherine_wintheiser , 8 месяцев назад

@dorothea_stoltenberg 

Для проверки, реализует ли поле структуры определенный интерфейс в Golang, можно воспользоваться типовым утверждением (type assertion).


Пример кода:

 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
35
36
37
38
39
40
41
package main

import "fmt"

type Shape interface {
    area() float64
}

type Rectangle struct {
    width, height float64
}

// Реализация метода интерфейса Shape для структуры Rectangle
func (r Rectangle) area() float64 {
    return r.width * r.height
}

type Circle struct {
    radius float64
}

// Реализация метода интерфейса Shape для структуры Circle
func (c Circle) area() float64 {
    return 3.14 * c.radius * c.radius
}

func main() {
    // Создаем экземпляр структуры Rectangle
    rectangle := Rectangle{width: 4, height: 5}

    // Проверяем, реализует ли поле rectangle интерфейс Shape
    _, isShape := interface{}(rectangle).(Shape)
    fmt.Println(isShape) // true

    // Создаем экземпляр структуры Circle
    circle := Circle{radius: 3}

    // Проверяем, реализует ли поле circle интерфейс Shape
    _, isShape = interface{}(circle).(Shape)
    fmt.Println(isShape) // true
}


В приведенном выше примере используется interface{}(rectangle).(Shape), чтобы проверить, реализует ли поле rectangle интерфейс Shape. Если поле будет реализовывать интерфейс, то переменная isShape будет равна true.


Аналогично, мы используем interface{}(circle).(Shape), чтобы проверить, реализует ли поле circle интерфейс Shape. В этом случае также переменная isShape будет равна true.


Таким образом, такая проверка позволяет нам проверить, реализует ли поле структуры определенный интерфейс.