1. 嵌入接口实现组合
- 实现方式:在一个接口定义中嵌入其他接口,被嵌入接口的方法会成为新接口的一部分。
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
type ReadWriter interface {
Reader
Writer
}
- 实际应用场景优势:
- 简化接口定义:当一个接口需要包含多个已有接口的功能时,通过嵌入可以避免重复书写方法。例如在Go标准库中,
io.ReadWriter
接口就是通过嵌入io.Reader
和io.Writer
接口实现,这样任何实现了Read
和Write
方法的类型,自动实现了ReadWriter
接口。
- 清晰功能组合:从代码结构上清晰地展示了该接口是由哪些基本接口功能组合而成,易于理解和维护。
2. 结构体嵌入接口实现组合
- 实现方式:在结构体中嵌入接口类型,使结构体隐式实现嵌入接口的方法,同时结构体还可以添加自己的方法。
type Logger interface {
Log(message string)
}
type FileLogger struct {
Logger
filePath string
}
func (fl *FileLogger) WriteLog(message string) {
// 实现将日志写入文件的逻辑
}
- 实际应用场景优势:
- 功能扩展:结构体在实现已有接口功能基础上,可以添加额外的方法和字段进行功能扩展。例如
FileLogger
结构体在嵌入Logger
接口后,不仅可以实现Log
方法进行日志记录,还能添加filePath
字段和WriteLog
方法来实现将日志写入特定文件的功能。
- 复用性:如果多个结构体都需要某种接口的功能,通过嵌入接口可以方便地复用这些功能,提高代码复用率。
3. 类型实现多个接口实现组合
- 实现方式:一个类型实现多个不同的接口,从而将这些接口的功能组合到该类型上。
type Printer interface {
Print()
}
type Formatter interface {
Format() string
}
type Document struct {
content string
}
func (d *Document) Print() {
println(d.content)
}
func (d *Document) Format() string {
return "Formatted: " + d.content
}
- 实际应用场景优势:
- 灵活性:一个类型可以根据不同的需求场景,适配多种不同的接口。例如
Document
类型既可以作为Printer
接口的实例进行打印操作,也可以作为Formatter
接口的实例进行格式化操作,增强了类型的通用性和灵活性。
- 符合单一职责原则:每个接口负责特定的功能,类型通过实现多个接口,将不同功能组合在一起,同时保持每个接口功能的单一性,便于代码的维护和扩展。