Интерфейсы в Go: неявная реализация и композиция

К вопросам
Средний
Language Features

Вопрос

Как работают интерфейсы в 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{}?