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

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
}


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

以上是关于go语言学习笔记 — 进阶 — 接口:接口的嵌套组合 —— 把多个接口放到一个接口内的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 进阶 — 接口(2.3):接口无法实现的例子

go语言学习笔记 — 进阶 — 接口:在接口和类型之间转换

go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型

go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值

go语言学习笔记 — 进阶 — 接口(2.2):实现接口的条件 —— 接口中的方法都被实现

go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口