Функция context.TODO

Функция context.TODO возвращает непустой пустой контекст. Она не имеет никакого значения и предназначена для использования в качестве временного решения, когда неизвестно, какой контекст следует применить. Это может быть полезно на этапе разработки или рефакторинга, когда требуется передать контекст, но конкретный тип еще не определен.

Синтаксис

goctx := context.TODO()

Функция не принимает никаких параметров и возвращает значение типа context.Context.

Пример

Давайте рассмотрим использование context.TODO в функции, которая ожидает контекст:

gopackage main

import (
  "context"
  "fmt"
)

func process(ctx context.Context, data string) {
  select {
  case <-ctx.Done():
    fmt.Println("Operation cancelled")
  default:
    fmt.Printf("Processing: %s\n", data)
  }
}

func main() {
  ctx := context.TODO()
  process(ctx, "example data")
}

Результат выполнения кода:

go"Processing: example data"

В этом примере context.TODO используется для создания контекста, который передается в функцию process. Поскольку контекст не имеет таймаута или отмены, выполнение происходит без прерываний.

Пример

Рассмотрим ситуацию, когда контекст используется в многопоточном приложении, но конкретный контекст пока не определен:

gopackage main

import (
  "context"
  "fmt"
  "time"
)

func worker(ctx context.Context, id int) {
  select {
  case <-time.After(500 * time.Millisecond):
    fmt.Printf("Worker %d finished\n", id)
  case <-ctx.Done():
    fmt.Printf("Worker %d cancelled\n", id)
  }
}

func main() {
  ctx := context.TODO()
  for i := 0; i < 3; i++ {
    go worker(ctx, i)
  }
  time.Sleep(1 * time.Second)
}

Результат выполнения кода:

go"Worker 2 finished"
"Worker 1 finished"
"Worker 0 finished"

В этом примере context.TODO используется для запуска нескольких горутин. Поскольку контекст не поддерживает отмену, все горутины успешно завершаются.

Смотрите также

  • функцию context.Background,
    которая возвращает пустой контекст для инициализации
  • функцию context.WithCancel,
    которая создает контекст с возможностью отмены
  • функцию context.WithTimeout,
    которая создает контекст с таймаутом
  • тип context.Context,
    который определяет интерфейс для работы с контекстом