微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我们在Go的界面中不能拥有属性?

如何解决为什么我们在Go的界面中不能拥有属性?

沃尔克如此准确地在评论中留下了一个原因,他说: “接口仅封装行为。数据不是行为。”@H_502_2@

一个更容易理解的原因是:测试。当前,接口仅指定一组行为。假设我要测试一些需要Writer接口的代码。如果有些脚的开发人员实现了这样的接口:

type Writer interface {
    F *os.File
    Write(b []bytes) (int, error)
}

然后,我需要一个具有文件指针的模拟类型(nil由于接口应该可以被我调用代码使用,所以我可能无法将其保留在)。这本身就是可怕的。当然,创建临时文件很容易。

现在,这样的接口怎么样:

type ComplexInterface interface {
   Engine *mypkg.someComplexType
   Client *grpc.Client
   // and so on
}

我需要创建一个复杂的类型实例,而该实例又可能具有20个依赖关系……天哪,只知道对任何接口进行更改的代价可能是多么昂贵。如果mypkg.someComplexType发生变化,那么我很快就会发现另一个程序包中的测试开始中断,因为我已经创建了非常紧密的耦合。

所以是的:接口定义行为,添加属性会带来大量风险(接口为伪泛型,紧密耦合,维护地狱……)

无论哪种方式,如果您要在接口中使用 属性”@H_502_2@ ,为何不直接编写以下代码

type MyWriter interface {
    File() *os.File
    Write(b []bytes) (int, error)
}

属性代替吸气剂。任务完成。

解决方法

我了解您无法做到,并且了解界面在Go中的工作方式。但是我主要关心的是 为什么 决定接口不能声明字段。

我什至可以看到将其添加到Go V2中的建议。

有人可以对此给出清晰的解释吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。