Middle
Kokias galimybes suteikia vaikų duomenų konteksto kūrimas Go kalboje?
sobes.tech AI
Atsakymas iš AI
Sukurkite vaikų kontekstą naudodami context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, suteikiant šias galimybes:
- Atšaukimas: leidžia atšaukti vaikų kontekste pradėtas operacijas, neįtakodama tėvų konteksto. Tai pasiekiama iškvietus atšaukimo funkciją, kuri grąžinama konteksto kūrimo metu.
- Laiko limitas / Dėdlinas: riboja operacijų vykdymo laiką. Jei laikas pasibaigia iki operacijos pabaigos, kontekstas automatiškai atšaukiamas.
- Reikšmių perdavimas: leidžia perduoti specifines reikšmes, susijusias su užklausa ar operacija, žemyn funkcijų kvietimų grandinėje (pvz., užklausos identifikatorių, autentifikacijos duomenis), nekeičiant funkcijų parašų.
- Hierarchija: sukuria hierarchinę kontekstų struktūrą. Tėvo konteksto atšaukimas automatiškai atšaukia visus jo vaiko kontekstus.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Tėvo kontekstas, kuris atšaukiamas po 3 sekundžių
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Užtikriname, kad tėvo kontekstas bus atšauktas
// Sukuriame vaikų kontekstą su atšaukimu
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Užtikriname, kad vaikų kontekstas bus atšauktas
// Funkcija, kuri laukia konteksto atšaukimo
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Šis blokas įvykdys, kai kontekstas bus atšauktas
fmt.Println("Vaikų gretos atšaukimas:", ctx.Err())
}
}(childCtx) // perduodame vaikų kontekstą į gretą
// Dirbtinis vėlavimas demonstracijai
time.Sleep(5 * time.Second)
fmt.Println("Programa baigta")
}