Тип context.CancelFunc

Тип context.CancelFunc представляет собой функцию, которая отменяет связанный с ней контекст. Она возвращается функциями context.WithCancel, context.WithTimeout и context.WithDeadline. При вызове этой функции контекст отменяется, закрывается канал Context.Done и все операции, ожидающие этого контекста, получают сигнал об отмене.

Синтаксис

gotype CancelFunc func()

Пример

Давайте создадим контекст с функцией отмены и вызовем ее:

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  ctx, cancel := context.WithCancel(context.Background())
  defer cancel()

  if ctx.Err() == nil {
    fmt.Println("Context is active")
  }

  cancel()

  if ctx.Err() != nil {
    fmt.Println(ctx.Err())
  }
}

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

go"Context is active"
"context canceled"

Пример

Используем функцию отмены для остановки горутины:

gopackage main

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

func main() {
  ctx, cancel := context.WithCancel(context.Background())

  go func() {
    for {
      select {
      case <-ctx.Done():
        fmt.Println("Goroutine stopped")
        return
      default:
        fmt.Println("Working...")
        time.Sleep(500 * time.Millisecond)
      }
    }
  }()

  time.Sleep(2 * time.Second)
  cancel()
  time.Sleep(1 * time.Second)
}

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

go"Working..."
"Working..."
"Working..."
"Working..."
"Goroutine stopped"

Пример

Вызов функции отмены несколько раз не вызывает паники:

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  ctx, cancel := context.WithCancel(context.Background())

  cancel()
  cancel()
  cancel()

  if ctx.Err() != nil {
    fmt.Println(ctx.Err())
  }
}

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

go"context canceled"

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

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