如果我正确理解 Go 实践,调用者(也称为消费者)应该从他们的依赖项(也称为生产者)中定义他们想要使用的接口。
但是,如果生产者有一个接受自定义类型的函数,那么最好让它接受一个接口,对吧?这样消费者就可以传递一些符合生产者接口的值,而不知道确切的类型。因为生产者函数的输入值使生产者成为该输入值的“消费者”。
好吧,很公平。
问题是,消费者如何定义一个接口,其中包含一个函数,其参数是生产者定义的接口?
假设我有一个名为chefstruct 的包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
相关分类