Интерфейсы в Go: неявная реализация и композиция
Вопрос
Как работают интерфейсы в Go? Что такое неявная реализация интерфейсов? Приведите примеры композиции интерфейсов.
Ответ
Особенности интерфейсов в Go: - Неявная реализация - не нужно явно указывать implements - Структурная типизация - важна сигнатура методов, не имена типов - Пустой интерфейс interface{} (теперь any) принимает любое значение - Композиция интерфейсов - встраивание одного в другой
// Простой интерфейс
type Writer interface {
Write([]byte) (int, error)
}
// Композиция интерфейсов
type ReadWriter interface {
Reader
Writer
}
// Неявная реализация
type MyWriter struct{}
func (mw MyWriter) Write(data []byte) (int, error) {
fmt.Print(string(data))
return len(data), nil
}
// MyWriter автоматически реализует Writer
var w Writer = MyWriter{}
// Простой интерфейс
type Writer interface {
Write([]byte) (int, error)
}
// Композиция интерфейсов
type ReadWriter interface {
Reader
Writer
}
// Неявная реализация
type MyWriter struct{}
func (mw MyWriter) Write(data []byte) (int, error) {
fmt.Print(string(data))
return len(data), nil
}
// MyWriter автоматически реализует Writer
var w Writer = MyWriter{}
Дополнительные вопросы
Что такое type assertion и type switch? Как безопасно работать с interface{}?