当前位置: 首页 > 面试题库 >

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

裴凯定
2023-03-14
问题内容

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

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

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


问题答案:

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

另一个更容易理解的原因是:测试。当前,接口仅指定一组行为。假设我要测试一些需要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发生变化,那么我很快就会发现另一个程序包中的测试开始中断,因为我已经创建了非常紧密的耦合。

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

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

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

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



 类似资料:
  • 问题内容: 3年前,我可以在express.js中进行多个res.send。 甚至编写setTimeout来显示实时输出。 现在它将抛出: 我知道nodejs和express已更新。为什么现在不能这样做?还有其他想法吗? 找到了解决方案,但API参考http://expressjs.com/4x/api.html中没有“ res.write” … :S 问题答案: 也许您需要: 隐式调用,后跟。如

  • 问题内容: 我有以下定义: 我尝试按如下方式调用它,但收到错误消息: 这符合: 问题答案: 该相关转到FAQ中指出,和«别在内存相同的表示»。 要了解原因,让我们剖析两件事: 切片是一个后备存储阵列,外加几个包含切片大小和容量的整数。 在Go中,数组并不是某种意义上的“高级”。相反,它们包含的元素的布局是严格定义的:它们全部包含在内存的相邻区域中,彼此相邻。 这意味着,在切片的支持数组中,元素是类

  • 我使用JavaFX Scene Builder1.1创建了一个FXML文件。默认情况下创建AnchorPane。为什么我不能修改resizable属性?

  • 我正在修改我以前使用的Visitor模式。我们有基类Element,它有虚拟方法接受(Visitor),并且这个方法在继承自Element的所有类中都被重写。在任何派生类中,接受()所做的就是调用visitor- 为什么客户不能直接打电话给访客- 调用元素中有哪些有用的信息。接受(访客),然后依次呼叫访客。参观(元素)?这使得Visitor模式的使用很麻烦,并且在所有元素类的层次结构中都需要额外的

  • 问题内容: 为什么Java不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。

  • 问题内容: 我们都知道我们需要在React中绑定函数以使其起作用。我知道为什么我们需要绑定它。 但是我不确定为什么我们不需要绑定箭头功能。 示例:使用箭头功能(无需绑定) }; 现在,使用功能(需要绑定) }; 我不是在问为什么我们需要绑定功能。我只想知道为什么箭头功能不需要绑定。 谢谢。 问题答案: 仅仅因为arrow函数的上下文中没有以下内容: 这个 论点 超 新目标 所以,当你引用此箭头功能