Sobes.tech
Middle

Povedzte mi o prípadoch použitia kontextu v Go.

sobes.tech AI

Odpoveď od AI

Kontext v Go sa používa na riadenie životného cyklu požiadaviek a kontrolu vykonávania gorútin. Hlavné prípady použitia:

  • Zrušenie: Umožňuje zrušiť reťazec gorútin spojený s určitým požiadavkom. Napríklad pri zatvorení spojenia alebo po časovom limite.
  • Časový limit: Nastavuje konečný termín vykonania operácie. Ak operácia nie je dokončená včas, kontext je zrušený. To zabraňuje nekonečnému čakanie.
  • Prenos špecifických údajov požiadavky: Umožňuje prenášať údaje súvisiace s konkrétnou požiadavkou (napríklad ID používateľa, identifikátor trasovania) cez reťazec volaní funkcií bez zmeny ich podpisov.

Príklady použitia:

  1. Zrušenie podľa signálu:

    balík main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcia worker(ctx context.Context, id int) {
    	za {
    		výber {
    		prípad <-ctx.Done():
    			fmt.Printf("Pracovník %d prerušen\n", id)
    			vrátenie
    		default:
    			fmt.Printf("Pracovník %d pracuje...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    }
    
    funkcia main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Zaručíme zrušenie
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time Sekunda)
    	cancel() // Zrušíme kontext
    
    	time.Sleep(500 * time.Millisecond) // Dáme čas gorutinám dokončiť
    }
    
  2. Časový limit:

    balík main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funkcia longOperation(ctx context.Context) error {
    	výber {
    	prípad <-time.After(3 * time.Second): // Imitačná dlhá práca
    		fmt.Println("Operácia úspešne dokončená")
    		vrátenie nil
    	prípad <-ctx.Done():
    		fmt.Println("Operácia zrušená kontextom:", ctx.Err())
    		vrátenie ctx.Err()
    	}
    }
    
    funkcia main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	err := longOperation(ctx)
    	akže ak err != nil {
    		fmt.Println("Chyba:", err)
    	}
    }
    
  3. Prenos údajov:

    balík main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	userID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Spracovanie požiadavky pre používateľské ID: %d\n", userID)
    	// Ďalšie spracovanie požiadavky s použitím userID
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }