Sök…


Syntax

  • typ Avbryt Funk func ()
  • func Bakgrund () Kontext
  • func TODO () Context
  • func WithCancel (överordnad kontext) (ctx-sammanhang, avbryt AvbrytFun)
  • func WithDeadline (överordnad kontext, tidsfrist.Tid) (Context, CancelFunc)
  • func WithTimeout (överordnad kontext, timeout-tid. varaktighet) (Context, CancelFunc)
  • func WithValue (överordnad kontext, nyckelgränssnitt {}, valgränssnitt {})

Anmärkningar

Den context paketet (i Go 1,7) eller golang.org/x/net/context paketet (Pre 1,7) är ett gränssnitt för att skapa sammanhang som kan användas för att utföra begäran scoped värden och deadlines över API gränser och mellan tjänster, samt som en enkel implementering av nämnda gränssnitt.

åt sidan: ordet "kontext" används löst för att hänvisa till hela trädet, eller till enskilda blad i trädet, t.ex. den faktiska context.Context .

På hög nivå är ett sammanhang ett träd. Nya blad läggs till trädet när de är konstruerade (en context.Context med ett överordnat värde), och bladen tas aldrig bort från trädet. Varje sammanhang har åtkomst till alla värden ovanför (datatillgång flyter bara uppåt), och om något sammanhang avbryts avbryts dess barn också (avbrytningssignaler propogerar nedåt). Avbrytningssignalen implementeras med hjälp av en funktion som returnerar en kanal som kommer att stängas (läsbar) när sammanhanget avbryts; detta gör sammanhang till ett mycket effektivt sätt att implementera rörledningen och annullering samtidighet mönster , eller timeouts.

Genom konvention har funktioner som tar ett sammanhang det första argumentet ctx context.Context . Även om detta bara är en konvention, är det en som bör följas eftersom många statiska analysverktyg specifikt letar efter detta argument. Eftersom Context är ett gränssnitt, är det också möjligt att förvandla befintlig kontextliknande data (värden som passeras runt i en kedja för samtalskedja) till ett normalt Go-sammanhang och använda dem på ett bakåtkompatibelt sätt bara genom att implementera några metoder. Dessutom är sammanhang säkra för samtidig åtkomst så att du kan använda dem från många goroutiner (oavsett om de körs på parallella trådar eller som samtidiga koroutiner) utan rädsla.

Vidare läsning

Kontextträd representerat som en riktad graf

Ett enkelt kontextträd (som innehåller några vanliga värden som kan begäras scoped och ingår i en kontext) byggd från Go-kod som följande:

// Pseudo-Go
ctx := context.WithValue(
    context.WithDeadline(
        context.WithValue(context.Background(), sidKey, sid),
        time.Now().Add(30 * time.Minute),
    ),
    ridKey, rid,
)
trCtx := trace.NewContext(ctx, tr)
logCtx := myRequestLogging.NewContext(ctx, myRequestLogging.NewLogger())

Är ett träd som kan representeras som en riktad graf som ser ut så här:

Kontext representerat som en riktad graf

Varje barnkontext har tillgång till värdena i sina överordnade sammanhang, så datatillgången flyter uppåt i trädet (representerat av svarta kanter). Annulleringssignaler å andra sidan reser ner på trädet (om ett sammanhang avbryts, avbryts också alla dess barn). Annulleringssignalflödet representeras av de grå kanterna.

Använda en kontext för att avbryta arbete

Att överföra ett sammanhang med en timeout (eller med en avbrytningsfunktion) till en funktion med lång körning kan användas för att avbryta att funktionerna fungerar:

ctx, _ := context.WithTimeout(context.Background(), 200*time.Millisecond)
for {
    select {
    case <-ctx.Done():
        return ctx.Err()
    default:
        // Do an iteration of some long running work here!
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow