如果我正确理解 Go 实践,调用者(也称为消费者)应该从他们的依赖项(也称为生产者)中定义他们想要使用的接口。
但是,如果生产者有一个接受自定义类型的函数,那么最好让它接受一个接口,对吧?这样消费者就可以传递一些符合生产者接口的值,而不知道确切的类型。因为生产者函数的输入值使生产者成为该输入值的“消费者”。
好吧,很公平。
问题是,消费者如何定义一个接口,其中包含一个函数,其参数是生产者定义的接口?
假设我有一个名为chef
struct 的包Chef
。它有一个方法Cut(fruit) error
,fruit
是在我的包中定义的一个接口chef
。
现在假设我在调用代码中,我导入了 package chef
。我想给它一个水果来切,但在我的例子中,我实现了一个名为Apple
. 自然地,我会尝试为自己构建这个界面:
type myRequirements interface { Cut(Apple) error}
因为我有接口的具体实现fruit
叫Apple
,所以我想说明我的接口只适用于苹果。
但是,如果我尝试针对我的界面使用Chef{}
,Go 将抛出编译错误,因为我的界面想要Cut(Apple)
和Chef{}
想要的Cut(Fruit)
。尽管 Apple 实现了fruit
.
避免这种情况的唯一方法似乎是制作chef.Fruit
一个公共界面,并在我自己的界面中使用它。
type myRequirements interface { Cut(chef.Fruit) error}
但这完全破坏了我在接口下插入不同实现(而不是chef
)的能力,因为现在我与chef
.
所以 Chef 有一个内部接口fruit
,但调用者只知道 Apple。我如何在调用者的界面中指示应该输入什么Cut
而不引用chef
?
我很惊讶这不是 Go 社区中更一致的概念。
我需要 myRequirements 接口的原因是因为我是 chef 包的消费者。此外Cut
,厨师可能还有100多种方法。但我只使用Cut
. 我想向其他开发人员表明,在我的情况下,我只使用Cut
. 我还想让测试只模拟Cut
我的代码工作。此外,我需要能够插入不同的实现Cut
(来自不同的厨师)。这是我帖子开头提到的 golang 最佳实践。
胡子哥哥
qq_遁去的一_1
慕娘9325324