Sobes.tech
Middle

Պատմեք ինձ կոնտեքստի օգտագործման դեպքերի մասին Go-ում։

sobes.tech AI

Պատասխան AI-ից

Go- ում կոնտեքստը օգտագործվում է հարցումների կյանքի ցիկլը կառավարելու և goroutine-ների կատարման վերահսկման համար: Հիմնական կիրառման դեպքերը՝

  • Չեղարկում: Позволяет отменить цепочку goroutine-ների, կապված որոշակի հարցման հետ: Օրինակ՝ կապը փակելիս կամ ժամանակային սահմանափակման դեպքում:
  • Ժամկետային սահմանափակում: Կարգավորում է գործողության կատարման վերջնաժամկետը: Եթե գործողությունը չի ավարտվում ժամանակին, կոնտեքստը չեղարկվում է:
  • Հատուկ տվյալների փոխանցում: Позволяет передавать данные, связанные с конкретным запросом (например, ID пользователя, трассировки), առանց փոփոխելու ֆունկցիաների ստորագրությունները:

Օգտագործման օրինակներ՝

  1. Չեղարկում սիգնալով:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func worker(ctx context.Context, id int) {
    	for {
    		select {
    		case <-ctx.Done():
    			fmt.Printf("Աշխատող %d ընդհատվեց\n", id)
    			return
    		default:
    			fmt.Printf("Աշխատող %d աշխատում է...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Համոզված ենք չեղարկման մասին
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Չեղարկում է կոնտեքստը
    
    	time.Sleep(500 * time.Millisecond) // Տալիս ենք ժամանակ goroutine-ներին ավարտելու համար
    }
    
  2. Ժամկետային սահմանափակում:

    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    func longOperation(ctx context.Context) error {
    	switch {
    	case <-time.After(3 * time.Second): // Դիտարկում երկար աշխատանք
    		fmt.Println("Գործողությունը հաջողությամբ ավարտվեց")
    		return nil
    	case <-ctx.Done():
    		fmt.Println("Գործողությունը չեղարկվեց կոնտեքստով:", ctx.Err())
    		return ctx.Err()
    	}
    }
    
    func main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	err := longOperation(ctx)
    	if err != nil {
    		fmt.Println("Սխալ:", err)
    	}
    }
    
  3. Տվյալների փոխանցում:

    package main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	userID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Հարցման մշակումը օգտվողի ID: %d\n", userID)
    	// Հաջորդ մշակումը՝ օգտագործելով userID
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }