Sobes.tech
Middle

Rääkige mulle konteksti kasutamise juhtudest Go-s.

sobes.tech AI

Vastus AI-lt

Go kontekstit kasutatakse päringute elutsükli haldamiseks ja gorutiinide täitmise kontrollimiseks. Peamised kasutusjuhtumid:

  • Tühistamine: võimaldab tühistada konkreetse päringuga seotud gorutiinide ahela. Näiteks ühenduse sulgemisel või ajapiirangu täitumisel.
  • Aja piir: määrab operatsiooni täitmise lõppkuupäeva. Kui operatsioon ei lõpe õigeaegselt, tühistatakse kontekst. See takistab lõpmatut ootamist.
  • Andmete edastamine: võimaldab edastada konkreetse päringuga seotud andmeid (näiteks kasutaja ID, jälgimise identifikaator) funktsioonide ahelas ilma nende signatuuride muutmiseta.

Kasutusnäited:

  1. Tühistamine signaaliga:

    pakett main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funktsioon worker(ctx context.Context, id int) {
    	valik {
    		juhtum <-ctx.Done():
    			fmt.Printf("Tööline %d katkestati\n", id)
    			tagasi
    		vaik:
    			fmt.Printf("Tööline %d töötab...\n", id)
    			time.Sleep(500 * time.Millisecond)
    		}
    	}
    
    funktsioon main() {
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // Tagab tühistamise
    
    	go worker(ctx, 1)
    	go worker(ctx, 2)
    
    	time.Sleep(2 * time.Second)
    	cancel() // Tühistab konteksti
    
    	time.Sleep(500 * time.Millisecond) // Annab aega gorutiinidele lõpetamiseks
    }
    
  2. Aja piir:

    pakett main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    funktsioon longOperation(ctx context.Context) viga {
    	valik {
    	juhtum <-time.After(3 * time.Second): // Pikk töö imiteerimine
    		fmt.Println("Operatsioon edukalt lõpetatud")
    		tagasi nil
    	juhtum <-ctx.Done():
    		fmt.Println("Operatsioon tühistati konteksti poolt:", ctx.Err())
    		tagasi ctx.Err()
    	}
    }
    
    funktsioon main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    	defer cancel()
    
    	viga := longOperation(ctx)
    	kui viga != nil {
    		fmt.Println("Viga:", viga)
    	}
    }
    
  3. Andmete edastamine:

    pakett main
    
    import (
    	"context"
    	"fmt"
    )
    
    type UserKey string
    
    const userIDKey UserKey = "userID"
    
    func processRequest(ctx context.Context) {
    	kasutajaID := ctx.Value(userIDKey).(int)
    	fmt.Printf("Päringu töötlemine kasutaja ID-ga: %d\n", kasutajaID)
    	// Järgmine töötlemine kasutades kasutaja ID-d
    }
    
    func main() {
    	ctx := context.WithValue(context.Background(), userIDKey, 123)
    	processRequest(ctx)
    }