go语言学习笔记 — 接口 — 接口的嵌套组合:把多个接口放到一个接口内

在go中,结构体可以内嵌,创建出新的结构体;同理,接口也可以内嵌,创建出新的接口。接口与接口嵌套组合生成新接口,只要接口的所有方法都被实现,则这个接口中的所有嵌套接口均可被调用。


系统包中的接口嵌套组合

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

// 写入接口
type Writer interface {
    Write(p []byte) 
}

// 关闭接口,实现内存资源的释放
type Closer interface {
    Close()  error 
}

// 写入关闭接口,同时拥有Writer和Closer的特性
type WriteCloser interface {
    Writer         // 由两个接口嵌套组合,生成扩展接口
    Closer
}

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

package main

import (
	"io"
	"testing"
)

// // io包中的写入接口
// type Writer interface {
// 	Write(p []byte)
// }

// // io包中的关闭接口,实现内存资源的释放
// type Closer interface {
// 	Close() error
// }

// // io包中的写入关闭接口,同时拥有Writer和Closer的特性
// type WriteCloser interface {
// 	Writer // 由两个接口嵌套组合,生成扩展接口
// 	Closer
// }

// 声明一个设备结构体,用于模拟一个虚拟设备
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结构体实例化wc,由于device类型已经实现了io.WriteCloser的所有内嵌接口,因此wc的类型可以看作是io.WriteCloser接口类型(被隐式转换了)
	var wc io.WriteCloser = new(device)

	// wc实例调用Write方法,写入数据
	wc.Write(nil)

	// wc实例调用Close方法,关闭设备
	wc.Close()

	// 声明写入器writeOnly,类型是io.Writer,并赋值device新实例
	var writeOnly io.Writer = new(device)

	// writeOnly实例只调用Write方法,写入数据
	writeOnly.Write(nil)
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybhr6ZJo-1573786932466)(quiver-image-url/8BF63573D8294E3E1DB6A60D92C56B08.jpg =633x94)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J9GZcODW-1573786932467)(quiver-image-url/B08EDE11DB9FF9B5C613FCD3A3982C7A.jpg =630x89)]

给io.WriterCloser和io.Writer更换不同的实现者(结构体方法),可以动态地切换实现代码。

你可能感兴趣的:(Golang)