在this tutorial中提供以下示例:
func LongRunningHandler(ctx context.Context) string {
deadline, _ := ctx.Deadline()
for {
select {
case <- time.Until(deadline).Truncate(100 * time.Millisecond):
return "Finished before timing out."
default:
log.Print("hello!")
time.Sleep(50 * time.Millisecond)
}
}
}
编译此代码时出现以下错误:invalid operation: <-time.Until(deadline).Truncate(100 * time.Millisecond) (receive from non-chan type time.Duration)
示例中的代码有什么问题?
答案 0 :(得分:2)
<-
用于从频道接收,因此time.Until
或Truncate
都不会返回频道。
在这种情况下,错误消息是识别问题,但并不能确切地说明实际上有什么不同。
go DOES提供一些返回频道的时间方法。其中一个是time.After
select {
case m := <-c:
handle(m)
case <-time.After(5 * time.Minute):
fmt.Println("timed out")
}
我强烈建议您以身作则,参观一下。他们在介绍频道和for/select
答案 1 :(得分:1)
func LongRunningHandler(ctx context.Context) string {
deadline, _ := ctx.Deadline()
for {
select {
case <- time.After(time.Until(deadline).Truncate(100 * time.Millisecond)):
return "Finished before timing out."
default:
log.Print("hello!")
time.Sleep(50 * time.Millisecond)
}
}
}