Sobes.tech
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")
}