要求:
- 只能编辑 foo 函数
- foo 函数必须调用 slow 函数
- foo 函数在 ctx 超时后必须立刻返回
【加分项】如果 slow 结束的比 ctx 快,也立刻返回
1 | package main |
分析
我们来 one by one
地 check
一遍题目要求:
- 只能编辑 foo 函数
- foo 函数必须调用 slow 函数
- foo 函数在 ctx 超时后必须 立刻 返回
很明显,这里涉及到 go 语言里面利用 context
控制上下文问题,超时返回,那必然要用到 for-select
编程模式了。
但由于 slow
执行时会 sleep
,阻塞当前协程,因此 slow
不能在 for-select
函数体内,必须在一个单独的协程中,结束后通过 channel
(如 sigCh
)通知其它协程。
【加分项】如果 slow 结束的比 ctx 快,也 立刻 返回。说明在 for-select
函数体内,除了要监听 context
的信号,也要监听 sigCh
是否有数据返回。
综合考虑这几点后,实现起来就不难了。
参考实现
1 | package main |
扩展
有个细节需要注意:
close(sigCh)
处能不能改成sigCh <- struct{}{}
?为什么?
请读者自己试验下,并分析输出结果^_^