Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpIfVl 27 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() { 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 и скажите, какой тип окажется внутри после присваивания.

Скажите, хранит ли переменная интерфейса только указатель на метод или еще и данные конкретного значения.

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