English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang basic tutorial

Golang control statements

Golang functions & methods

Golang structs

Golang slices & arrays

Golang strings (String)

Golang pointers

Golang interfaces

Golang concurrency

Golang exceptions (Error)

Golang other items

Вложенные интерфейсы в Go

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 и своего собственного.