В Go используется неявная реализация интерфейсов (implicit interface implementation). Это означает, что:
type Writer interface {
Write([]byte) (int, error)
}
type File struct {
name string
}
// Реализуем метод Write для File
func (f File) Write(data []byte) (int, error) {
// реализация метода
return len(data), nil
}
// Теперь File автоматически реализует Writer
Хотя явное объявление не требуется, есть идиоматический способ проверки на этапе компиляции:
var _ Writer = (*File)(nil) // Проверка, что *File реализует Writer
Если тип не реализует интерфейс, компилятор выдаст ошибку.
Гибкость:
Декомпозиция:
Пустые интерфейсы:
interface{}
Встраивание интерфейсов:
type ReadWriter interface {
Reader
Writer
}
Интерфейсы с параметризованными методами:
type Stringer interface {
String() string
}
Попытка явного объявления:
type File implements Writer
Неполная реализация:
в Go реализация интерфейсов происходит неявно - достаточно реализовать все методы интерфейса для типа. Для проверки можно использовать идиому с присваиванием переменной заглушки, что позволяет выявить проблемы на этапе компиляции.