网站地图    收藏    合作   
<

快捷菜单 返回顶部

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

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

系统包中的接口嵌套组合

Go语言的 io 包中定义了写入器(Writer)、关闭器(Closer)和写入关闭器(WriteCloser)3个接口,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
type Writer interface {
    Write(p []byte) (n int, err error)
}
 
type Closer interface {
    Close() error
}
 
type WriteCloser interface {
    Writer
    Closer
}
代码说明如下:

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

在代码中使用 io.Writer、io.Closer 和 io.WriteCloser 这 3 个接口时,只需要按照接口实现的规则实现 io.Writer 接口和 io.Closer 接口即可。而 io.WriteCloser 接口在使用时,编译器会根据接口的实现者确认它们是否同时实现了 io.Writer 和 io.Closer 接口,详细实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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)
 
}
代码说明如下:
为了整理思路,将上面的实现、调用关系使用图方式来展现,参见图 1 和图 2。

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


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

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


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

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com