Go 语言接口嵌套

在Go语言中,接口是方法签名的集合,它也是一种类型,意味着您可以创建接口类型的变量。众所周知,Go语言不支持继承,但是Go接口完全支持嵌套。在嵌套过程中,一个接口可以嵌套其他接口,或者一个接口可以在其中嵌套其他接口的方法签名,两者的结果与示例1和2中所示的相同。您可以在单个接口中嵌套任意数量的接口。而且,如果对接口的方法进行了任何更改,则在将一个接口嵌套其他接口时,该接口也将反映在嵌套式接口中,如示例3所示。

语法:

type interface_name1 interface {

    Method1()
}

type interface_name2 interface {

    Method2()
}

type finalinterface_name interface {

    interface_name1
    interface_name2
}

或

type interface_name1 interface {

    Method1()
}

type interface_name2 interface {

    Method2()
}

type finalinterface_name interface {

    Method1()
    Method2()
}

接口嵌套示例1:

package main

import "fmt"

// 接口 1
type AuthorDetails interface {
    details()
}

// 接口 2
type AuthorArticles interface {
    articles()
}

// 接口 3

//接口3嵌套接口1和接口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:    "Computer science",
        college:   "XYZ",
        year:      2012,
        salary:    50000,
        particles: 209,
        tarticles: 309,
    }

    // 使用FinalDetails接口访问接口1,2的方法
    var f FinalDetails = values
    f.details()
    f.articles()
}

输出:

作者: Mickey
部门: Computer science 通过日期: 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:    "Computer science",
        college:   "XYZ",
        year:      2012,
        salary:    50000,
        particles: 209,
        tarticles: 309,
    }

输出:

作者: Mickey
部门: Computer science 通过日期: 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("\n作者Id: %d", a.cid)
    fmt.Printf("\n提交: %s", a.post)
}

func main() {

    //结构体赋值
    values := author{

        a_name:    "Mickey",
        branch:    "Computer science",
        college:   "XYZ",
        year:      2012,
        salary:    50000,
        particles: 209,
        tarticles: 309,
        cid:       3087,
        post:      "Technical content writer",
        pick:      58,
    }

    // 使用 FinalDetails 接口访问接口1,2的方法
    var f FinalDetails = values
    f.details()
    f.articles()
    f.picked()
    f.cdeatils()
}

输出:

作者: Mickey
部门: Computer science 通过日期: 2012
大学名称: XYZ
薪水: 50000
发表文章数: 209
待定文章数: 100
所选文章的总数: 58
作者Id: 3087
提交: Technical content writer

用法说明:如上例所示,我们有三个接口。接口1和2是简单接口,而接口3是嵌套式接口,其中包含接口1的方法签名,接口2和它自己的方法。因此,如果接口1的方法和接口2发生任何更改,它将反映在接口3中。接口3可以访问接口1中的所有方法,包括接口1、2和它自己的方法。