Есть 2 варианта проверки: на этапе компиляции и в рантайме.
На этапе компиляции
Для проверки реализации методов интерфейса, можно использовать типизированный nil
.
var _ Interface = (*Type)(nil)
Сам по себе он не содержит никаких данных, не требует аллокации, но при этом обладает типом, который может быть прочитан и использован.
type Animal interface {
GetName()
}
var _ Animal = (*Cat)(nil)
type Cat struct {
string name
}
Если структура не реализовывает методы итерфейса, то при попытке запустить такой код произойдёт ошибка.
./prog.go:11:16: cannot use (*Cat)(nil) (value of type *Cat) as type Animal in variable declaration:
*Cat does not implement Animal (missing GetName method)
https://go.dev/play/p/dmx37JJZnmT
В рантайме:
Использовать утверждение типа (type assertion).
Утверждение типа x.(T)
утверждает, что конкретное значение, хранящееся в x
, имеет тип T
, и что x
не равно nil
.
- Если
T
не является интерфейсом, он утверждает, что динамический типx
идентиченT
. - Если
T
является интерфейсом, он утверждает, что динамический типx
реализуетT
.
_, ok = interface{}(Cat{}).(Animal)