我了解您无法做到,并且了解接口在Go中的工作方式。但是我主要关心的是为什么决定接口无法声明字段。
我什至可以看到将其添加到Go V2中的提案。
有人可以对此给出清晰的解释吗?
答案 0 :(得分:2)
一个原因,正如沃尔克(Volker)准确地将其放在注释中一样:“接口仅封装行为。数据不是行为。”
另一个更容易理解的原因是:测试。当前,接口仅指定一组行为。假设我要测试一些需要function f(a::T, x::R) where {T<:Number, R<:Number}
g(R(2), a, one(T), x)
end
接口的代码。如果有些脚的开发人员实现了这样的接口:
Writer
然后,我需要一个具有文件指针的模拟类型(由于接口应该可以被我调用的代码使用,所以我可能无法将其留在type Writer interface {
F *os.File
Write(b []bytes) (int, error)
}
处)。就其本身而言,这是可怕的。当然,创建临时文件很容易。
现在这样的界面怎么样:
nil
我需要创建一个复杂的类型实例,而该实例又可能具有20个依赖关系……上帝只知道对任何接口进行更改的代价可能是多么昂贵。如果type ComplexInterface interface {
Engine *mypkg.SomeComplexType
Client *grpc.Client
// and so on
}
发生了变化,那么我很快就会发现另一个包中的测试开始中断,因为我已经创建了非常紧密的耦合。
是的:接口定义行为,添加属性会带来大量风险(接口为伪泛型,紧密耦合,维护地狱……)
无论哪种方式,如果您要在界面中使用“属性” ,为什么不简单地这样写:
mypkg.SomeComplexType
用属性代替吸气剂。工作完成。