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

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

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

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

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

от maya , 23 дня назад

@ally 

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


Для проверки, реализует ли структура интерфейс, можно воспользоваться конструкцией var _ ИмяИнтерфейса = &СтруктураНаРеализацию{}. Если компилятор не выдаст ошибок, то структура реализует интерфейс. Например:

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

type MyStruct struct {
    Field1 string
    Field2 int
}

func (s *MyStruct) Method1() {
    fmt.Println("Method1")
}

func (s *MyStruct) Method2() {
    fmt.Println("Method2")
}

func main() {
    var _ MyInterface = &MyStruct{}
}


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

1
2
3
4
5
6
7
func main() {
    s := &MyStruct{Field1: "hello", Field2: 123}
    var i MyInterface = s

    i.Method1()
    fmt.Println(i.(*MyStruct).Field1)
}


Здесь мы создали переменную i с типом интерфейса MyInterface и присвоили ей значение поля s. Затем вызываем метод Method1() интерфейса i и обращаемся к полю Field1 структуры s через типовое преобразование i.(*MyStruct).