Go语言接口的嵌套组
一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。
系统包中的接口嵌套组
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 更换不同的实现者,可以动态地切换实现代码。
- 随机文章
- 老婆 老板 马尔代夫(夫妻两内部矛盾,老板请夫妻游马尔代夫,结果令人意外)
- 中国 马尔代夫 历史事件(中国马尔代夫历史事件:两国关系优化与深化)
- 马尔代夫怎样升级(马尔代夫实现升级,成为全球旅游热点!)
- 宁夏人去马尔代夫(从宁夏到马尔代夫,海岛游的奢华之旅)
- 头像马尔代夫沙滩(沉醉于马尔代夫蔚蓝海岸的慢节奏假期)
- 赶海 马尔代夫(抢着抓鱼——马尔代夫的渔民们)
- 泥鳗 马尔代夫(后的:马尔代夫的泥鳗文化)
- 广东马尔代夫海边(广东沿海现身类似马尔代夫的海滩风光)
- 蒙阴 马尔代夫(蒙阴游客暂时无法前往马尔代夫)
- 水床 马尔代夫(重温水上乐园体验:马尔代夫之水床)
- 贵阳马尔代夫攻略(贵阳直飞马尔代夫,轻松玩转海上仙境)
- 涿州马尔代夫简介(了解涿州马尔代夫,您的海岛度假胜地)
- 病毒营销马尔代夫(马尔代夫旅游行业变革:病毒营销现身)
- 蓝色马尔代夫冲浪(重温蓝色马尔代夫,畅享美妙冲浪之旅)
- 涪陵马尔代夫淹死(涪陵马尔代夫发生严重洪灾致多人罹难)
- 镇江马尔代夫游泳(马尔代夫游泳之旅——镇江旅行社推荐)
- 马尔代夫分港口吗(马尔代夫港口重新分配,优化水运交通)
- 马尔代夫企业组团(马尔代夫企业联合出击,共享智慧资源)
- 新塘 马尔代夫(新塘旅行社推出马尔代夫行程,走起!)
- 水母 马尔代夫(马尔代夫海域现现巨型水母!赶快来一探究竟!)
- 马尔代夫印度雷达(马尔代夫安装印度雷达,提升海上安全)
- 马尔代夫企业组织(马尔代夫公司联合体组建了新组织体系)
- 莒县马尔代夫旅游(走入莒县马尔代夫,享受无尽海岛魅力)
- 马尔代夫全程费用(探秘马尔代夫旅行全程需要多少费用?)
- 马尔代夫云上公路(马尔代夫建云上高速公路,穿云而过!)
- 马尔代夫六天报价(五星马尔代夫行程六日游,超值报价!)
- 马尔代夫单反技巧(如何在马尔代夫用单反拍出完美照片?)
- 中国 小马尔代夫(“中国版小马尔代夫”:人间仙境在哪里?)
- 东台 马尔代夫(东台旅行社推出马尔代夫游,快来预订!)
- 许晴 马尔代夫(许晴现身马尔代夫,尽显美好身姿)
