func WithDeadline
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
WithDeadline возвращает копию родительского контекста с deadline, не позднее d. Если deadline родительского объекта наступил раньше, чем d, WithDeadline(parent, d) семантически эквивалентен родительскому. Канал Done возвращенного контекста закрывается при deadline, при вызове функция отмены или когда канал Done родительского контекста закрыт, в зависимости от того, что произойдет раньше.
Отмена текущего контекста освобождает связанные с ним ресурсы, поэтому код должен вызывать cancel, как только операции исполняемые в этом Context выполнятся.
В следующем примере выполняется контекст с произвольным deadline, сообщающий функции блокировки, что контекст должен завершиться, как только он дойдет до нее.
package main
import (
"context"
"fmt"
"time"
)
func main() {
d := time.Now().Add(50 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), d)
// Несмотря на то, что ctx просрочен,
// хорошей практикой будет использовать вызов функции отмены в любом случае.
// Несоблюдение этого требования может привести к тому,
// что контекст и его родитель будут выполняться дольше, чем это необходимо.
defer cancel()
select {
case <-time.After(1 * time.Second):
fmt.Println("overslept")
case <-ctx.Done():
fmt.Println(ctx.Err())
}
}