golang:接口的嵌套组合

逃离我推掉我的手 2022-02-25 04:48 412阅读 0赞

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

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

系统包中的接口嵌套组合

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

  1. type Writer interface {
  2. Write(p []byte) (n int, err error)
  3. }
  4. type Closer interface {
  5. Close() error
  6. }
  7. type WriteCloser interface {
  8. Writer
  9. Closer
  10. }
  • 第 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 接口,详细实现代码如下:

  1. package main
  2. import (
  3. "io"
  4. )
  5. // 声明一个设备结构
  6. type device struct {
  7. }
  8. // 实现io.Writer的Write()方法
  9. func (d *device) Write(p []byte) (n int, err error) {
  10. return 0, nil
  11. }
  12. // 实现io.Closer的Close()方法
  13. func (d *device) Close() error {
  14. return nil
  15. }
  16. func main() {
  17. // 声明写入关闭器, 并赋予device的实例
  18. var wc io.WriteCloser = new(device)
  19. // 写入数据
  20. wc.Write(nil)
  21. // 关闭设备
  22. wc.Close()
  23. // 声明写入器, 并赋予device的新实例
  24. var writeOnly io.Writer = new(device)
  25. // 写入数据
  26. writeOnly.Write(nil)
  27. }
  1. io.WriteCloser的实现及调用过程如图 1 所示。
    在这里插入图片描述
  2. io.Writer 的实现调用过程如图 2 所示。
    在这里插入图片描述

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

发表评论

表情:
评论列表 (有 0 条评论,412人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golang设计模式(3)组合模式

    组合模式,使我们在树形结构问题中,使用者可以忽略简单元素和复杂元素的概念。客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素内部结构解耦。当应用场景出现分

    相关 golang接口声明

    接口本身是调用方和实现方需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程。 golang使用组合实现对象特性的描述。对象的内部使用结构体