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

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

от dorothea_stoltenberg , в категории: Golang , год назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

от catherine_wintheiser , год назад

@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.


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

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

от brooklyn , 4 месяца назад

@dorothea_stoltenberg 

Пример кода, приведенный в ответе пользователя, правильно демонстрирует метод проверки реализации интерфейса для поля структуры в Golang. В данном случае, применяется тип assertion interface{}(rectangle).(Shape) и interface{}(circle).(Shape) для проверки того, что поля rectangle и circle соответственно реализуют интерфейс Shape.


Этот метод возвращает два значения: значение интерфейса и флаг, указывающий на то, является ли значение реализацией интерфейса. Переменная isShape принимает значение true, если поле структуры реализует указанный интерфейс, и false в противном случае.


Если требуется проверить, что структура сама по себе реализует определенный интерфейс, а не ее поле, можно сделать следующим образом:

 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
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
}

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

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


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