我应该从标准库嵌入接口还是自己编写?

Go 的标准库中有一些通用接口,例如io.Closer:


type Closer interface {

    Close() error

}

如果我想在我的代码中定义一个具有Close方法的接口,我会像这样嵌入io.Closer:


type example interface {

    io.Closer


    // ... some other functions or embedded types

}

还是我只是定义函数本身,如:


type example interface {

    Close() error


    // ... some other functions or embedded types

}

有什么最佳做法吗?


开心每一天1111
浏览 88回答 1
1回答

慕村9548890

对于这样常见且简单的接口,我肯定会嵌入标准库中的接口(例如io.Closer,io.Reader和io.ByteReader)。但不是任何接口类型。一般来说,接口应该在需要的地方定义。嵌入在其他包(包括标准库)中定义的任何接口都有在更改或扩展时无法隐式实现它们的危险。包的“所有者”(定义者)可能会更改它(例如用新方法扩展它)并正确更新实现它的所有类型,因此包可以继续从外部工作,但显然包所有者不会更新你的实现。例如,接口类型在Go 1.0reflect.Type中没有Type.ConvertibleTo()方法,它是在Go 1.1中添加的。同样的事情也可能发生:标准库中的接口可能会在未来的 Go 版本中被更改或扩展,导致您现有的代码无法实现它们。小型通用接口和“其余”之间有什么区别?接口越大,抽象越弱——Go 谚语也是如此。小接口喜欢io.Closer并io.Reader捕获一个微小但重要的功能。它们是如此普遍,“每个”库都试图实现它们,每个实用函数都建立在它们之上。我从没想过他们会改变。如果有理由更改/扩展它们,它们将被添加为新接口。不像更大的接口,抽象更难准确捕获。随着时间的推移,他们有更好的机会改变/发展。
打开App,查看更多内容
随时随地看视频慕课网APP