Метод reflect.Type.Implements

Метод Implements проверяет, реализует ли тип, представленный объектом reflect.Type, переданный интерфейс. В качестве единственного параметра метод принимает объект reflect.Type, представляющий интерфейсный тип. Метод возвращает true, если тип реализует все методы интерфейса, и false в противном случае.

Синтаксис

got.Implements(interfaceType)

Пример

Давайте проверим, реализует ли структура MyStruct интерфейс fmt.Stringer:

gopackage main

import (
  "fmt"
  "reflect"
)

type MyStruct struct {
  Value int
}

func (m MyStruct) String() string {
  return fmt.Sprintf("MyStruct: %d", m.Value)
}

func main() {
  var s MyStruct
  t := reflect.TypeOf(s)
  
  var stringer fmt.Stringer
  interfaceType := reflect.TypeOf(&stringer).Elem()
  
  res := t.Implements(interfaceType)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Так как структура MyStruct имеет метод String, который соответствует сигнатуре метода интерфейса fmt.Stringer, результатом будет true.

Пример

Давайте проверим, реализует ли структура MyStruct интерфейс error:

gopackage main

import (
  "fmt"
  "reflect"
)

type MyStruct struct {
  Value int
}

func (m MyStruct) String() string {
  return fmt.Sprintf("MyStruct: %d", m.Value)
}

func main() {
  var s MyStruct
  t := reflect.TypeOf(s)
  
  var err error
  interfaceType := reflect.TypeOf(&err).Elem()
  
  res := t.Implements(interfaceType)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Структура MyStruct не реализует интерфейс error, так как не имеет метода Error. Результатом будет false.

Пример

Давайте проверим, реализует ли тип int интерфейс fmt.Stringer:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var num int
  t := reflect.TypeOf(num)
  
  var stringer fmt.Stringer
  interfaceType := reflect.TypeOf(&stringer).Elem()
  
  res := t.Implements(interfaceType)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Встроенный тип int не реализует интерфейс fmt.Stringer, поэтому результат будет false.

Смотрите также

  • метод reflect.Type,
    который представляет тип в рефлексии
  • метод reflect.Type.AssignableTo,
    который проверяет возможность присваивания типу
  • метод reflect.Type.ConvertibleTo,
    который проверяет возможность преобразования типу
  • функцию reflect.TypeOf,
    которая возвращает рефлексивный тип значения