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ă
fa rulat cândcancel()se întoarce.frulează î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).