传参是 Scheduler,接受者是ReadyNotifier,为什么不报错,类型不匹配啊???

来源:16-5 重构和总结

SuperDi

2021-12-12

老师,下面是您的代码(省略无关代码):

type Scheduler interface {
	ReadyNotifier
	Submit(Request)
	WorkerChan() chan Request
	Run()
}

type ReadyNotifier interface {
	WorkerReady(chan Request)
}


func (e *ConcurrentEngine) Run(seeds ...Request) {
	for i := 0; i < e.WorkerCount; i++{
		createWorker(e.Scheduler.WorkerChan(), out, e.Scheduler)
	}
}

func createWorker(in chan Request, out chan ParseResult, ready ReadyNotifier)  {
	。。。。
}

createWorker(e.Scheduler.WorkerChan(), out, e.Scheduler) 传入的参数是 e.Scheduler 为什么接受者居然是ReadyNotifier
这儿不太明白,能解释下吗?

写回答

1回答

ccmouse

2021-12-21

type Scheduler interface { ReadyNotifier Submit(Request) WorkerChan() chan Request Run() }

注意看Scheduler里面套了个ReadyNotifier。

可以回顾一下4-4 使用内嵌来扩展已有类型

这里就相当于Scheduler接口带有WorkerReady(chan Request)函数,因此它也必定实现ReadyNotifier接口。

1
1
matthew21
多重实现啊,课程里能提到这一点就好了 e.Scheduler实现了ReadNotify和Scheduler两个接口,可以用父类接口接收子类参数,等于多态
2022-04-04
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1908 问题

查看课程