为什么具有相同方法的两个命名接口被视为不同的接口 - 如何避免这种情况?假设我们有一个喜欢吃产品的人(Eater)。他不在乎他是什么产品,他只想被指出从哪里可以买到新产品。换句话说,他想要产品服务,但并不关心产品服务会生产什么产品。在具体的实现中我们会尽量给他喂苹果,所以我们会给他提供appleService。结果如下:./main.go:9: cannot use appleService (type *service.AppleService) as type eater.ProductServiceI in function argument: *service.AppleService does not implement eater.ProductServiceI (wrong type for New method) have New() service.ProductI want New() eater.ProductI接口service.AppleI和eater.AppleI具有相同的方法Eat(),除了 golang 将它们视为不同的方法。为什么以及如何避免这种情况?根据鸭子输入,这应该有效,因为实际ProductServiceI需要的是提供的结构具有Eat()方法 - 它不应该关心什么名称具有接口(service.ProductIvs eater.ProductI)。下面是完整代码:==> ./main.go <==package mainimport "./apple/service"import "./eater"func main() { appleService := &service.AppleService{} // func eater.New(productService ProductServiceI) appleEater := eater.New(appleService) appleEater.EatUntilHappy()}==> ./eater/eater.go <==package eatertype ProductServiceI interface { New() ProductI}type ProductI interface { Eat()}type Eater struct { productService ProductServiceI}func New(productService ProductServiceI) *Eater { return &Eater{ productService: productService, }}func (a *Eater) EatUntilHappy() { for i:=0; i < 5; i++ { product := a.productService.New() product.Eat() }}==> ./apple/service/service.go <==package serviceimport "./apple"type ProductI interface { Eat()}type AppleService struct {}func (a *AppleService) New() ProductI { return &apple.Apple{}}==> ./apple/service/apple/apple.go <==package appleimport "fmt"type Apple struct {}func (a *Apple) Eat() { fmt.Println("mniam, mniam")}我认为只要声明相同,什么名称或什么导入路径都有接口并不重要。
3 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
只是为了完成:如果您在接口中使用私有方法(小写方法名称),可能会发生非常相似的情况(存在具有相同签名的方法,但 Go 找不到它们)。
这样,Go 将其对方法的搜索限制在定义接口的包中,因此不会在实现该方法的包中找到方法。
实际上,我想不出在公共接口中使用私有方法的任何合理理由:对接口的方法使用与接口本身相同的可见性。
- 3 回答
- 0 关注
- 200 浏览
添加回答
举报
0/150
提交
取消