用1而不是0初始化chan:
ch := make(chan Response, 1)
并删除关闭并延迟ch的延迟块。
参见:http :
//blog.golang.org/go-concurrency-patterns-timing-out-
and
我认为这是正在发生的事情:
- 5s超时后,timeoutHttpGet返回
- defer语句运行,关闭ch,然后将其设置为nil
- go例程开始执行实际的提取操作,然后尝试将其数据发送到ch
- 但ch为零,因此不会收到任何东西,从而阻止了该语句的完成,从而阻止了go例程的完成
我假设您正在设置,
ch =nil是因为在您这样做之前,您会遇到运行时恐慌,因为这是您尝试写入规范中所述的关闭通道时发生的情况。
给ch一个1的缓冲区意味着fetch go例程可以发送给它而无需接收者。如果处理程序由于超时而返回,则稍后将收集所有垃圾。



