Тип context.CancelFunc
Тип context.CancelFunc представляет собой функцию,
которая отменяет связанный с ней контекст. Она возвращается
функциями context.WithCancel,
context.WithTimeout и
context.WithDeadline. При вызове этой функции
контекст отменяется, закрывается канал
Context.Done и все операции, ожидающие этого
контекста, получают сигнал об отмене.
Синтаксис
type CancelFunc func()
Пример
Давайте создадим контекст с функцией отмены и вызовем ее:
package 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())
}
}
Результат выполнения кода:
"Context is active"
"context canceled"
Пример
Используем функцию отмены для остановки горутины:
package 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)
}
Результат выполнения кода:
"Working..."
"Working..."
"Working..."
"Working..."
"Goroutine stopped"
Пример
Вызов функции отмены несколько раз не вызывает паники:
package main
import (
"context"
"fmt"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
cancel()
cancel()
cancel()
if ctx.Err() != nil {
fmt.Println(ctx.Err())
}
}
Результат выполнения кода:
"context canceled"
Смотрите также
-
функцию
context.WithCancel,
которая создает контекст с функцией отмены -
тип
context.Context,
который предоставляет интерфейс для работы с контекстом -
функцию
context.WithTimeout,
которая создает контекст с таймаутом -
функцию
context.Background,
которая возвращает пустой корневой контекст