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

https://go.dev/play/p/S4AyInpBTPO