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}有什么最佳做法吗?
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
对于这样常见且简单的接口,我肯定会嵌入标准库中的接口(例如io.Closer
,io.Reader
和io.ByteReader
)。
但不是任何接口类型。一般来说,接口应该在需要的地方定义。嵌入在其他包(包括标准库)中定义的任何接口都有在更改或扩展时无法隐式实现它们的危险。
包的“所有者”(定义者)可能会更改它(例如用新方法扩展它)并正确更新实现它的所有类型,因此包可以继续从外部工作,但显然包所有者不会更新你的实现。
例如,接口类型在Go 1.0reflect.Type
中没有Type.ConvertibleTo()
方法,它是在Go 1.1中添加的。同样的事情也可能发生:标准库中的接口可能会在未来的 Go 版本中被更改或扩展,导致您现有的代码无法实现它们。
小型通用接口和“其余”之间有什么区别?接口越大,抽象越弱——Go 谚语也是如此。小接口喜欢io.Closer
并io.Reader
捕获一个微小但重要的功能。它们是如此普遍,“每个”库都试图实现它们,每个实用函数都建立在它们之上。我从没想过他们会改变。如果有理由更改/扩展它们,它们将被添加为新接口。不像更大的接口,抽象更难准确捕获。随着时间的推移,他们有更好的机会改变/发展。
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消