Есть 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)