Sobes.tech
Middle

მითხარით, როგორ გამოიყენება კონტექსტი Go-ში.

sobes.tech AI

პასუხი AI-სგან

Go- ում კონტექსტი გამოიყენება მოთხოვნების სიცოცხლის ციკლის მართვისა და goroutine-ების შესრულების კონტროლის მიზნით. ძირითადი გამოყენების შემთხვევები:

  • გაუქმება: საშუალებას აძლევს გაუქმდეს კონკრეტული მოთხოვნის დაკავშირებული goroutine-ების ჯაჭვი. მაგალითად, კავშირის დახურვის ან დროის გასვლის დროს.
  • დროის ზღვარი: ადგენს ოპერაციის შესრულების საბოლოო ვადას. თუ ოპერაცია დროულად არ დასრულდა, კონტექსტი გაუქმებულია. ეს თავიდან აცილებს უსასრულო მოლოდინს.
  • მონაცემების გადაცემა: საშუალებას აძლევს გადმოსცეთ კონკრეტული მოთხოვნის მონაცემები (მაგალითად, მომხმარებლის ID, ტრასირების იდენტიფიკატორი) ფუნქციების ჯაჭვში მათი სიგნატურების შეცვლის გარეშე.

გამოყენების მაგალითები:

  1. გაუქმება სიგნალით:

    პაკეტი main
    
    იმპორტი (
    	"context"
    	"fmt"
    	"time"
    )
    
    ფუნქცია worker(ctx context.Context, id int) {
    	საკანში {
    		არჩევა {
    		საგანი <-ctx.Done():
    			fmt.Printf("მუშაკი %d შეწყდა\n", id)
    			დაბრუნება
    		სხვა:
    			fmt.Printf("მუშაკი %d მუშაობს...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    ფუნქცია main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // გარანტირებული გაუქმება
    
    	გადადი worker(ctx, 1)
    	გადადი worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // კონტექსტის გაუქმება
    
    	time.Sleep(500 * time.Millisecond) // დრო მივცეთ goroutine-ებს დასრულებისთვის
    }
    
  2. დროის ზღვარი:

    პაკეტი main
    
    იმპორტი (
    	"context"
    	"fmt"
    	"time"
    )
    
    ფუნქცია longOperation(ctx context.Context) შეცდომა {
    	საკანში {
    	საგანი <-time.After(3 * time.Second): // იმიტაცია ხანგრძლივი სამუშაოს
    		fmt.Println("ოპერაცია წარმატებით დასრულდა")
    		დაბრუნება nil
    	სხვა <-ctx.Done():
    		fmt.Println("ოპერაცია გაუქმდა კონტექსტით:", ctx.Err())
    		დაბრუნება ctx.Err()
    	}
    }
    
    ფუნქცია main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	შეცდომა := longOperation(ctx)
    	თუ err != nil {
    		fmt.Println("შეცდომა:", err)
    	}
    }
    
  3. მონაცემების გადაცემა:

    პაკეტი main
    
    იმპორტი (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    ფუნქცია processRequest(ctx context.Context) {
    	მომხმარებლის ID := ctx.Value(userIDKey).(int)
    	fmt.Printf("მოთხოვნის დამუშავება მომხმარებლის ID: %d\n", userID)
    	// შემდეგი დამუშავება userID-ის გამოყენებით
    }
    
    ფუნქცია main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }