在设计和构造代码时,接口是Go语言的基石之一。然而,就像许多工具或概念一样,滥用它们通常不是一个好主意。接口污染就是用不必要的抽象使我们的代码变得难以理解。这是来自另一种编程语言具有不同习惯的开发人员经常犯的错误。在深入讨论这个话题之前,让我们重新思考一下Go的接口。然后,我们将看到什么时候使用接口是合适的,什么时候可能被认为是污染。
1.概念
接口提供了一种方法来指定对象的行为。我们使用接口来创建多个对象实现的公共抽象。Go接口与其他接口的不同之处在于它们是隐式的,没有像implements这样的显式关键字来标记对象X实现了接口Y。
为了理解是什么使接口如此强大,我们将深入研究标准库中的两个流行接口:io.Reader和io.Writer包为I/O原语提供抽象。在这些抽象概念中,io.Reader涉及从数据源读取数据,io.Writer向目标写入数据。如下图所示
io.Reader只包含一个Read方法:
typer Reader interface {
Read(p []byte)(n int,err error)
}
io.Reader接口的自定义实现是接收了一个字节切片,用接收的数据填充字节切片,并返回读取的字节数或一个错误。
另一方面,io.Writer定义了一方法Writer:
type Writer interface {
Write(p []byte) (n int,err error)
}
io.Writer接口的自定义实现是将来自字节片的数据写入目标,并返回写入的字节数或一个错误。因此,这两个接口都提供了基本的抽象:
- io.Reader 从源读取数据
- io.Writer 将数据写入目标
那么在该语言中使用这两个接口的基本原理是什么?创建这些抽象的意义是什么?
假设我们需要实现一个函数,该函数将一个文件的内容复制到另一个文件。我们可以创建一个特定的函数,将两个*os.Files作为输入。或者,我们可以选择使用io.Reader和io.Writer抽象创建一个更泛型的函数:
func copySourceToDest(source io.Reader, dest io.Writer) error {
//...
}
这个函数可以与参数*os.File及实现这些接口的任何其他类型一起工作。例如,我们可以创建自己的写入数据库的io.Writer,代码将保持不变&#
标签:Writer,写入,接口,污染,io,Reader,Go From: https://blog.csdn.net/canglonghacker/article/details/137163137