получить от не-чан типа времени. Продолжительность - PullRequest
0 голосов
/ 16 мая 2018

В этот учебник содержит следующий пример:

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 голосов
/ 16 мая 2018

Использование 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)
                }
        }
}
0 голосов
/ 16 мая 2018

<- предназначен для приема из канала, для этого ни time.Until, ни Truncate не возвращает канал.

В этом случае сообщение об ошибке идентифицирует проблему, но на самом деле не сообщаетчто на самом деле делать по-другому.

go Предоставляет несколько временных методов, которые возвращают каналы.Одним из которых является time.After

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

Я очень рекомендую пойти на примере и экскурсия по го.Они делают потрясающую работу, представляя каналы и for/select

...