Sobes.tech
Middle

Pastāstiet man par konteksta lietošanas gadījumiem Go.

sobes.tech AI

Atbilde no AI

Go konteksts tiek izmantots pieprasījumu dzīves cikla pārvaldībai un gorutīnu izpildes kontrolei. Galvenie lietošanas gadījumi:

  • Atcelšana: ļauj atcelt saistīto gorutīnu ķēdi ar konkrētu pieprasījumu. Piemēram, aizverot savienojumu vai pēc laika limita.
  • Laika limits: nosaka operācijas izpildes galējo termiņu. Ja operācija nebeidzas laikā, konteksts tiek atcelts. Tas novērš bezgalīgu gaidīšanu.
  • Datu nodošana: ļauj nodot ar konkrētu pieprasījumu saistītus datus (piemēram, lietotāja ID, trasēšanas identifikatoru) funkciju ķēdē bez to parakstu maiņas.

Lietošanas piemēri:

  1. Atcelšana ar signālu:

    pakotne main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcija worker(ctx context.Context, id int) {
    	izvēle {
    		gadījums <-ctx.Done():
    			fmt.Printf("Darbinieks %d pārtraukts\n", id)
    			atgriezties
    		pārējais:
    			fmt.Printf("Darbinieks %d strādā...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    
    funkcija main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Garantēts atcelšana
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Atceļ kontekstu
    
    	time.Sleep(500 * time.Millisecond) // Dod laiku gorutīnām pabeigt darbu
    }
    
  2. Laika limits:

    pakotne main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcija longOperation(ctx context.Context) kļūda {
    	izvēle {
    	gadījums <-time.After(3 * time.Second): // Ilga darba imitācija
    		fmt.Println("Operācija veiksmīgi pabeigta")
    		atgriezties nil
    	gadījums <-ctx.Done():
    		fmt.Println("Operācija atcelta ar kontekstu:", ctx.Err())
    		atgriezties ctx.Err()
    	}
    }
    
    funkcija main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	kļūda := longOperation(ctx)
    	ja kļūda != nil {
    		fmt.Println("Kļūda:", kļūda)
    	}
    }
    
  3. Datu nodošana:

    pakešu main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	lietošanasID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Pieprasījuma apstrāde lietotāja ID: %d\n", lietošanasID)
    	// Turpmākā apstrāde ar lietotāja ID
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }