Встраивание интерфейсов
Комбинируйте интерфейсы
«Встраивание интерфейсов» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Композиция интерфейсов
Интерфейсы могут встраивать другие интерфейсы, объединяя их наборы методов в более крупный контракт. Стандартная библиотека повсеместно использует этот подход.
Синтаксис встраивания
Укажите тип интерфейса внутри другого интерфейса, чтобы включить все его методы.
package main
import "fmt"
type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
Reader
Writer
}
func main() {
var rw ReadWriter
fmt.Println(rw == nil)
}io.ReadWriter на практике
Классический пример — io.ReadWriter, определённый посредством встраивания io.Reader и io.Writer. Любой тип с обоими методами соответствует этому интерфейсу.
Соответствие составному интерфейсу
Конкретный тип реализует объединённый интерфейс, просто имея все необходимые методы.
package main
import "fmt"
type Reader interface{ Read() string }
type Writer interface{ Write(s string) }
type ReadWriter interface {
Reader
Writer
}
type File struct{ data string }
func (f *File) Read() string { return f.data }
func (f *File) Write(s string) { f.data = s }
func main() {
var rw ReadWriter = &File{}
rw.Write("hi")
fmt.Println(rw.Read())
}Зачем компоновать интерфейсы
Небольшие интерфейсы легко реализовывать и тестировать. Их композиция позволяет создавать более крупные контракты только там, где это необходимо, сохраняя каждую часть минимальной.
Создание из небольших частей
Определяйте узкоспециализированные интерфейсы с одним методом, а затем объединяйте их.
package main
import "fmt"
type Opener interface{ Open() }
type Closer interface{ Close() }
type OpenCloser interface {
Opener
Closer
}
type Door struct{}
func (Door) Open() { fmt.Println("opened") }
func (Door) Close() { fmt.Println("closed") }
func main() {
var oc OpenCloser = Door{}
oc.Open()
oc.Close()
}Без дублирующихся методов
Встроенные интерфейсы не должны добавлять пересекающиеся методы с конфликтующими сигнатурами; одинаковые наборы методов допустимы в современных версиях Go.
Принимайте узкие интерфейсы
Функции должны требовать самый маленький необходимый интерфейс. Принимайте io.Reader, а не io.ReadWriteCloser, если нужно только читать.
package main
import "fmt"
type Reader interface{ Read() string }
func dump(r Reader) { fmt.Println(r.Read()) }
type Buf struct{}
func (Buf) Read() string { return "data" }
func main() {
dump(Buf{})
}Семейство io
Стандартная библиотека объединяет Reader, Writer и Closer в ReadCloser, WriteCloser и ReadWriteCloser — в стройную систему контрактов.
Составные интерфейсы в API
Возвращайте самый широкий интерфейс, который поддерживает значение, но принимайте самый узкий интерфейс, используемый функцией. Это обеспечивает максимальные гибкость и ясность.
Встраивание интерфейсов и структур
- Встраивание структур продвигает поля и методы для повторного использования поведения
- Встраивание интерфейсов объединяет требования к методам в более крупный контракт
Быстрая проверка
Проверьте свои знания о встраивании интерфейсов.
Итоги
Вы изучили встраивание интерфейсов.
- Перечисляйте интерфейсы внутри другого, чтобы объединить наборы методов
- Пакет io объединяет Reader, Writer и Closer
- Сохраняйте базовые интерфейсы небольшими и объединяйте их по необходимости
- Принимайте самый узкий интерфейс, необходимый функции
Часто задаваемые вопросы
Урок «Встраивание интерфейсов» бесплатный?
Да — полный текст урока «Встраивание интерфейсов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Встраивание интерфейсов»?
Комбинируйте интерфейсы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Встраивание интерфейсов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Встраивание структур
- Встраивание интерфейсов
- Продвижение методов
- Композиция вместо наследования