English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In Go language, an interface is a collection of method signatures, and it is also a type, which means you can create variables of interface type. As everyone knows, Go language does not support inheritance, but Go interfaces fully support nesting. During the nesting process, one interface can nest other interfaces, or an interface can nest the method signatures of other interfaces, resulting in the same as shown in examples 1 and 2. You can nest any number of interfaces in a single interface. Moreover, if any changes are made to the methods of an interface, then when nesting one interface into another, the changes will also be reflected in the nested interface, as shown in example 3.
Syntax:
type interface_name1 interface { Method1() } type interface_name2 interface { Method2() } type finalinterface_name interface { interface_name1 interface_name2 } or type interface_name1 interface { Method1() } type interface_name2 interface { Method2() } type finalinterface_name interface { Method1() Method2() }
Nested interface example 1:
package main import "fmt" // Интерфейс 1 type AuthorDetails interface { details() } // Интерфейс 2 type AuthorArticles interface { articles() } // Интерфейс 3 //interface 3 nested interface 1 and interface 2 type FinalDetails interface { AuthorDetails AuthorArticles } // Структура type author struct { a_name string branch string college string year int salary int particles int tarticles int } // Реализация метода интерфейса 1 func (a author) details() { fmt.Printf("Автор: %s", a.a_name) fmt.Printf("\nОтдел: %s Дата: %d", a.branch, a.year) fmt.Printf("\nНазвание университета: %s", a.college) fmt.Printf("\nЗарплата: %d", a.salary) fmt.Printf("\nКоличество опубликованных статей: %d", a.particles) } // Реализация метода интерфейса 2 func (a author) articles() { pendingarticles := a.tarticles - a.particles fmt.Printf("\nКоличество неопределенных статей: %d", pendingarticles) } func main() { // Присваивание структуры values := author{ a_name: "Mickey", branch: "Информатика", college: "XYZ", year: 2012, salary: 50000, particles: 209, tarticles: 309, } // Использование методов интерфейса FinalDetails для доступа к методам интерфейсов 1 и 2 var f FinalDetails = values f.details() f.articles() }
Вывод:
Автор: Mickey Отдел: Информатика Дата: 2012 Название университета: XYZ Зарплата: 50000 Количество опубликованных статей: 209 Количество неопределенных статей: 100
Инструкции по использованию:Как показано в примере выше, у нас есть три интерфейса. Интерфейсы 1 и 2 являются простыми интерфейсами, интерфейс 3 является вложенным интерфейсом, который содержит 1 и 2 интерфейсы. Таким образом, если интерфейсы 1 и 2 изменятся, интерфейс 3 изменится. Интерфейс 3 может доступ к всем методам, существующим в интерфейсах 1 и 2.
Вложение методов интерфейса:
package main import "fmt" // Интерфейс 1 type AuthorDetails interface { details() } // Интерфейс 2 type AuthorArticles interface { articles() } // Интерфейс 3 // Интерфейс 3 вложен в интерфейс 1 и метод type FinalDetails interface { details() articles() } // Структура type author struct { a_name string branch string college string year int salary int particles int tarticles int } // Реализация метода интерфейса 1 func (a author) details() { fmt.Printf("Автор: %s", a.a_name) fmt.Printf("\nОтдел: %s Дата: %d", a.branch, a.year) fmt.Printf("\nНазвание университета: %s", a.college) fmt.Printf("\nЗарплата: %d", a.salary) fmt.Printf("\nКоличество опубликованных статей: %d", a.particles) } // Реализация метода интерфейса 2 func (a author) articles() { pendingarticles := a.tarticles - a.particles fmt.Printf("\nКоличество неопределенных статей: %d", pendingarticles) } func main() { // Присваивание структуры values := author{ a_name: "Mickey", branch: "Информатика", college: "XYZ", year: 2012, salary: 50000, particles: 209, tarticles: 309, }
Вывод:
Автор: Mickey Отдел: Информатика Дата: 2012 Название университета: XYZ Зарплата: 50000 Количество опубликованных статей: 209 Количество неопределенных статей: 100
Инструкции по использованию:Как показано в примере выше, у нас есть три интерфейса. Интерфейсы 1 и 2 являются простыми интерфейсами, интерфейс 3 является вложенным интерфейсом, который содержит метод签名 интерфейсов 1 и 2. Таким образом, если методы интерфейсов 1 и 2 изменятся, это отразится на интерфейсе 3. Интерфейс 3 может доступ к всем методам, существующим в интерфейсах 1 и 2.
Пример интерфейса с вложением и своими методами интерфейса 3:
package main import "fmt" // Интерфейс 1 type AuthorDetails interface { details() } // Интерфейс 2 type AuthorArticles interface { articles() picked() } // Интерфейс 3 // Интерфейс 3 вложен в интерфейсы 1 и 2, и добавлены свои методы type FinalDetails interface { details() AuthorArticles cdeatils() } // Структура author type author struct { a_name string branch string college string year int salary int particles int tarticles int cid int post string pick int } // Реализация метода интерфейса 1 func (a author) details() { fmt.Printf("Автор: %s", a.a_name) fmt.Printf("\nОтдел: %s Дата: %d", a.branch, a.year) fmt.Printf("\nНазвание университета: %s", a.college) fmt.Printf("\nЗарплата: %d", a.salary) fmt.Printf("\nКоличество опубликованных статей: %d", a.particles) } // Реализация метода интерфейса 2 func (a author) articles() { pendingarticles := a.tarticles - a.particles fmt.Printf("\nКоличество неопределенных статей: %d", pendingarticles) } func (a author) picked() { fmt.Printf("\nОбщее количество выбранных статей: %d", a.pick) } // Реализация метода, внедренного в интерфейс func (a author) cdeatils() { fmt.Printf("\nID автора: %d", a.cid) fmt.Printf("\nПодача: %s", a.post) } func main() { // Ассигнование структуры values := author{ a_name: "Mickey", branch: "Информатика", college: "XYZ", year: 2012, salary: 50000, particles: 209, tarticles: 309, cid: 3087, post: "Технический писатель", pick: 58, } // Использование FinalDetails интерфейса для доступа к методам интерфейса 1 и 2 var f FinalDetails = values f.details() f.articles() f.picked() f.cdeatils() }
Вывод:
Автор: Mickey Отдел: Информатика Дата: 2012 Название университета: XYZ Зарплата: 50000 Количество опубликованных статей: 209 Количество неопределенных статей: 100 Общее количество выбранных статей: 58 ID автора: 3087 Подача: Технический писатель
Инструкции по использованию:Как показано в примере выше, у нас есть три интерфейса. Интерфейс 1 и 2 являются простыми интерфейсами, а интерфейс 3 является вложенным интерфейсом, который содержит метод签名 интерфейса 1 и методы интерфейса 2 и самого себя. Таким образом, если методы интерфейса 1 и интерфейса 2 будут изменены, это отразится на интерфейсе 3. Интерфейс 3 может доступ к всем методам интерфейса 1, включая методы интерфейса 1, 2 и своего собственного.