Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpIfIm 26 of 280 menu
◀ ▶

Неявная реализация в Go

Тип подходит под интерфейс сам, как только у него есть нужные методы. Отдельной строки этот тип подходит» в коде нет: компилятор сверяет список методов типа со списком в интерфейсе. Такую связь называют реализацией без явной записи в объявлении структуры.

Сделаем документ с методом печати и положим его в переменную интерфейса:

package main import "fmt" type Printer interface { Print() } type Doc struct { Title string } func (d Doc) Print() { fmt.Println(d.Title) } func main() { var p Printer = Doc{Title: "note"} p.Print() }

Присваивание собралось, потому что у Doc есть метод Print с получателем-значением и без параметров. В p лежит готовый документ с заголовком "note", вызов метода идет через переменную интерфейса.

Если метод повесить с получателем-указателем, а в интерфейс класть значение структуры, присваивание может не собраться из-за набора методов. Здесь получатель-значение совпадает с тем, что кладут в p.

Даны объявления:

package main type Printer interface { Print() } type Note struct { Text string }

Добавьте метод Print с получателем-значением, создайте Note с текстом "hi", запишите его в Printer и вызовите печать.

Дан следующий код:

package main type Printer interface { Print() } type Page struct { Body string }

Скажите, соберется ли присваивание var p Printer = Page{Body: "x"} без метода у Page.

Добавьте к Doc из примера урока второй метод Title, который возвращает поле заголовка. Скажите, сломается ли присваивание в Printer из-за лишнего метода.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить