context.AfterFunc în Go

Programează funcția f să ruleze (într-un goroutine nou) când contextul este anulat; stop() renunță la ea.

Sintaxă
func AfterFunc(ctx Context, f func()) (stop func() bool)

Ce face context.AfterFunc

context.AfterFunc(ctx, f) înregistrează o funcție care va rula automat, într-un goroutine separat, imediat după ce ctx este anulat sau expiră. Dacă ctx este deja anulat, f pornește imediat. Este util pentru curățenie: închiderea unei conexiuni, ștergerea unui fișier temporar, oprirea unei operații care nu știe de context.

Funcția stop returnată anulează înregistrarea. Returnează true dacă a oprit f înainte să pornească și false dacă f pornise deja sau fusese oprită. stop nu așteaptă ca f să se termine.

Parametri

Parametru Descriere
ctx Contextul urmărit.
f Funcția de rulat la anulare.

Ce returnează

Funcția stop func() bool.

Exemple

Exemplul 1: Curățenie la anulare

package main

import (
	"context"
	"fmt"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	gata := make(chan struct{})

	context.AfterFunc(ctx, func() {
		fmt.Println("Contextul s-a anulat: închid conexiunea și șterg fișierul temporar")
		close(gata)
	})

	fmt.Println("Lucrez...")
	cancel()
	<-gata
	fmt.Println("Gata")
}

Rezultat

Lucrez...
Contextul s-a anulat: închid conexiunea și șterg fișierul temporar
Gata

Exemplul 2: Renunțarea cu stop

Operația s-a terminat normal, deci nu mai e nevoie de curățenie: stop() o anulează înainte de cancel.

package main

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

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	stop := context.AfterFunc(ctx, func() {
		fmt.Println("Nu apare: am renunțat la curățenie")
	})

	fmt.Println("Operația s-a terminat normal")
	fmt.Println("stop() a oprit funcția:", stop())
	cancel()
	time.Sleep(20 * time.Millisecond) // dăm timp unui eventual goroutine
	fmt.Println("stop() din nou:", stop())
}

Rezultat

Operația s-a terminat normal
stop() a oprit funcția: true
stop() din nou: false

Greșeli frecvente

  • Presupui că f a rulat când cancel() se întoarce. f rulează în alt goroutine; dacă trebuie să aștepți, folosește un canal ca în primul exemplu.

Comenzi înrudite

  • context.WithCancel: Creează un context copil și o funcție cancel; apelul cancel() anunță toate goroutine-urile care îl folosesc să se oprească.
  • time.Timer: Un temporizator care trimite un singur semnal pe canalul C după o durată; poate fi oprit (Stop) sau repornit (Reset).
  • context.Context: Interfața care duce prin program semnalul de anulare, termenul limită și valori legate de o cerere (ctx).