0Pricing
Go Academy · Урок

Встраивание интерфейсов

Комбинируйте интерфейсы

«Встраивание интерфейсов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Встраивание структур
  2. Встраивание интерфейсов
  3. Продвижение методов
  4. Композиция вместо наследования
← Назад к Go Academy