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

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

от haylie.price , в категории: Общие вопросы , год назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

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

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

@haylie.price 

В Go нельзя проверить, реализует ли поле структуры определенный интерфейс, так как интерфейсы в Go реализуются неявно.


Однако, можно проверить, реализует ли сама структура определенный интерфейс, используя пустой идентификатор (blank identifier) для преобразования значения типа структуры в значение типа интерфейса.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
type MyInterface interface {
    MyMethod()
}

type MyStruct struct {}

func (s MyStruct) MyMethod() {
    fmt.Println("MyMethod called")
}

func main() {
    var s MyStruct

    _, ok := interface{}(s).(MyInterface)
    fmt.Println(ok) // true, MyStruct реализует MyInterface
}


В приведенном примере мы создаем структуру MyStruct и определяем метод MyMethod, который удовлетворяет интерфейсу MyInterface. Затем в функции main мы создаем переменную s типа MyStruct. С помощью пустого идентификатора _ мы преобразуем значение s в интерфейс типа MyInterface. Возвращенное значение используется для проверки ok, который будет true, если значение s реализует интерфейс MyInterface.

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

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

@haylie.price 

Кроме того, можно использовать функцию типа switch для проверки реализации интерфейса. Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
type MyInterface interface {
    MyMethod()
}

type MyStruct struct{}

func (s MyStruct) MyMethod() {
    fmt.Println("MyMethod called")
}

func main() {
    var s MyStruct

    switch s.(type) {
    case MyInterface:
        fmt.Println("s implements MyInterface")
    default:
        fmt.Println("s does not implement MyInterface")
    }
}


В этом примере мы снова определяем интерфейс MyInterface и структуру MyStruct с методом MyMethod. Затем в функции main мы создаем переменную s типа MyStruct и используем функцию типа switch для проверки типа s. Если s реализует интерфейс MyInterface, блок case MyInterface будет выполнен, иначе будет выполнен блок default.


Обратите внимание, что этот подход проверяет реализацию интерфейса типом структуры, а не конкретным полем структуры. Если вам нужно проверить реализацию интерфейса конкретным полем структуры, возможно, вам придется использовать рефлексию (reflect) или изменить ваш дизайн.