Неявная реализация в 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 из-за лишнего метода.