创新互联GO教程:Go语言接口的嵌套组合

在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通过嵌套创造出新的接口。

创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为遂平企业提供专业的成都做网站、成都网站制作,遂平网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。

系统包中的接口嵌套组合

Go语言的 io 包中定义了写入器(Writer)、关闭器(Closer)和写入关闭器(WriteCloser)3 个接口,代码如下:

type Writer interface {
    Write(p []byte) (n int, err error)
}

type Closer interface {
    Close() error
}

type WriteCloser interface {
    Writer
    Closer
}

代码说明如下:

  • 第 1 行定义了写入器(Writer),如这个接口较为常用,常用于 I/O 设备的数据写入。
  • 第 5 行定义了关闭器(Closer),如有非托管内存资源的对象,需要用关闭的方法来实现资源释放。
  • 第 9 行定义了写入关闭器(WriteCloser),这个接口由 Writer 和 Closer 两个接口嵌入。也就是说,WriteCloser 同时拥有了 Writer 和 Closer 的特性。

在代码中使用接口嵌套组合

在代码中使用 io.Writer、io.Closer 和 io.WriteCloser 这 3 个接口时,只需要按照接口实现的规则实现 io.Writer 接口和 io.Closer 接口即可。而 io.WriteCloser 接口在使用时,编译器会根据接口的实现者确认它们是否同时实现了 io.Writer 和 io.Closer 接口,详细实现代码如下:

package main

import (
    "io"
)

// 声明一个设备结构
type device struct {
}

// 实现io.Writer的Write()方法
func (d *device) Write(p []byte) (n int, err error) {
    return 0, nil
}

// 实现io.Closer的Close()方法
func (d *device) Close() error {
    return nil
}

func main() {

    // 声明写入关闭器, 并赋予device的实例
    var wc io.WriteCloser = new(device)

    // 写入数据
    wc.Write(nil)

    // 关闭设备
    wc.Close()

    // 声明写入器, 并赋予device的新实例
    var writeOnly io.Writer = new(device)

    // 写入数据
    writeOnly.Write(nil)

}

代码说明如下:

  • 第 8 行定义了 device 结构体,用来模拟一个虚拟设备,这个结构会实现前面提到的 3 种接口。
  • 第 12 行,实现了 io.Writer 的 Write() 方法。
  • 第 17 行,实现了 io.Closer 的 Close() 方法。
  • 第 24 行,对 device 实例化,由于 device 实现了 io.WriteCloser 的所有嵌入接口,因此 device 指针就会被隐式转换为 io.WriteCloser 接口。
  • 第 27 行,调用了 wc(io.WriteCloser接口)的 Write() 方法,由于 wc 被赋值 *device,因此最终会调用 device 的 Write() 方法。
  • 第 30 行,与 27 行类似,最终调用 device 的 Close() 方法。
  • 第 33 行,再次创建一个 device 的实例,writeOnly 是一个 io.Writer 接口,这个接口只有 Write() 方法。
  • 第 36 行,writeOnly 只能调用 Write() 方法,没有 Close() 方法。

为了整理思路,将上面的实现、调用关系使用图方式来展现,参见图 1 和图 2。

1) io.WriteCloser的实现及调用过程如图 1 所示。



图1:io.WriteCloser 的实现及调用过程

2) io.Writer 的实现调用过程如图 2 所示。



图2:io.Write 的实现及调用过程

给 io.WriteCloser 或 io.Writer 更换不同的实现者,可以动态地切换实现代码。

网站名称:创新互联GO教程:Go语言接口的嵌套组合
网站地址:http://www.csdahua.cn/qtweb/news49/262149.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网