Sobes.tech
Middle

Papaskinkite apie konteksto naudojimo atvejus Go.

sobes.tech AI

Atsakymas iš AI

„Go“ kontekstas naudojamas užklausų gyvavimo ciklo valdymui ir gorutinių vykdymo kontrolei. Pagrindiniai naudojimo atvejai:

  • Atšaukimas: leidžia atšaukti susijusią gorutinių grandinę su tam tikru užklausa. Pavyzdžiui, uždarius ryšį arba pasibaigus laikui.
  • Laiko limitas: nustato operacijos vykdymo galutinį terminą. Jei operacija nebaigiama laiku, kontekstas atšaukiamas. Tai užkerta kelią begaliniam laukimui.
  • Duomenų perdavimas: leidžia perduoti su konkrečia užklausa susijusius duomenis (pavyzdžiui, naudotojo ID, sekimo žymeklį) funkcijų grandinėje be jų parašų keitimo.

Naudojimo pavyzdžiai:

  1. Atšaukimas signalu:

    paket main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcija worker(ctx context.Context, id int) {
    	įvairovė {
    		pasirinkimas {
    		atvejis <-ctx.Done():
    			fmt.Printf("Darbininkas %d nutrauktas\n", id)
    			grįžti
    		numatyta:
    			fmt.Printf("Darbininkas %d dirba...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    funkcija main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Garantuoja atšaukimą
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Atšaukia kontekstą
    
    	time.Sleep(500 * time.Millisecond) // Duoda laiko gorutinėms užbaigti
    }
    
  2. Laiko limitas:

    paket main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcija longOperation(ctx context.Context) klaida {
    	įvairovė {
    	atsitiktinis <-time.After(3 * time.Second): // Ilgo darbo imitacija
    		fmt.Println("Operacija sėkmingai baigta")
    		grįžti nil
    	atsitiktinis <-ctx.Done():
    		fmt.Println("Operacija atšaukta konteksto:", ctx.Err())
    		grįžti ctx.Err()
    	}
    }
    
    funkcija main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	klaida := longOperation(ctx)
    	jei klaida != nil {
    		fmt.Println("Klaida:", klaida)
    	}
    }
    
  3. Duomenų perdavimas:

    pakuotė main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	naudotojoID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Užklausos apdorojimas naudotojo ID: %d\n", naudotojoID)
    	// Tolimesnė užklausos apdorojimas naudojant naudotojo ID
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }