从非陈类型时间收到。持续时间

时间:2018-05-16 11:39:47

标签: select go time

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)

示例中的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

<-用于从频道接收,因此time.UntilTruncate都不会返回频道。

在这种情况下,错误消息是识别问题,但并不能确切地说明实际上有什么不同。

go DOES提供一些返回频道的时间方法。其中一个是time.After

select {
case m := <-c:
        handle(m)
case <-time.After(5 * time.Minute):
        fmt.Println("timed out")
}

我强烈建议您以身作则,参观一下。他们在介绍频道和for/select

方面做得非常出色

答案 1 :(得分:1)

使用time.After

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)
                }
        }
}