«Если выглядит как утка и крякает как утка — это утка». В Go тип реализует интерфейс неявно — достаточно иметь нужные методы, не нужно явно писать implements.
Если структура имеет метод Read([]byte) (int, error) — она автоматически реализует io.Reader. Это позволяет писать гибкий код: функция принимает интерфейс, ей всё равно какой конкретный тип передан.
Проверка происходит в compile-time (в отличие от Python/JS, где duck typing — в runtime).