为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
开心每一天1111 2022-10-24 16:25:53
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.Readerio.ByteReader)。

但不是任何接口类型。一般来说,接口应该在需要的地方定义。嵌入在其他包(包括标准库)中定义的任何接口都有在更改或扩展时无法隐式实现它们的危险。

包的“所有者”(定义者)可能会更改它(例如用新方法扩展它)并正确更新实现它的所有类型,因此包可以继续从外部工作,但显然包所有者不会更新你的实现。

例如,接口类型在Go 1.0reflect.Type中没有Type.ConvertibleTo()方法,它是在Go 1.1中添加的。同样的事情也可能发生:标准库中的接口可能会在未来的 Go 版本中被更改或扩展,导致您现有的代码无法实现它们。

小型通用接口和“其余”之间有什么区别?接口越大,抽象越弱——Go 谚语也是如此。小接口喜欢io.Closerio.Reader捕获一个微小但重要的功能。它们是如此普遍,“每个”库都试图实现它们,每个实用函数都建立在它们之上。我从没想过他们会改变。如果有理由更改/扩展它们,它们将被添加为新接口。不像更大的接口,抽象更难准确捕获。随着时间的推移,他们有更好的机会改变/发展。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信