Значение интерфейса в Go
В переменную интерфейса кладут конкретное значение вместе с его типом. Снаружи виден только интерфейсный тип, но внутри лежит пара: какой именно тип был записан и само содержимое этого значения. Вызов метода идет по таблице методов того типа, который запомнили внутри.
Запишем документ в переменную и вызовем печать:
package main
import "fmt"
type Printer interface {
Print()
}
type Doc struct {
Title string
}
func (d Doc) Print() {
fmt.Println(d.Title)
}
func main() {
d := Doc{Title: "note"}
var p Printer = d
p.Print()
}
В p хранится тип Doc и копия
структуры с полем "note". Метод
Print берет данные из этой копии.
Если положить другое значение того же типа,
сменится только содержимое, имя типа внутри
останется прежним.
Можно сначала объявить пустую переменную интерфейса, затем присвоить ей готовое значение. Пока присваивания не было, внутри нет ни типа, ни содержимого. После записи появляются обе части сразу.
Даны типы из урока. Создайте Doc с
заголовком "draft", запишите его
в Printer и выведите результат печати.
Дан следующий код:
package main
type Printer interface {
Print()
}
type Doc struct {
Title string
}
func (d Doc) Print() {
}
var p Printer
Присвойте p значение Doc
и скажите, какой тип окажется внутри после
присваивания.
Скажите, хранит ли переменная интерфейса только указатель на метод или еще и данные конкретного значения.