Ինչպես են կառուցված կոնտեքստները Go լեզվում?
sobes.tech AI
Պատասխան AI-ից
context (context.Context) ԳՈ-ում օգտագործվում է տեղեկատվության փոխանցման համար ժամկետների, չեղարկումների և այլ տվյալների միջև API սահմանների։ Այն ներկայացնում է ծառ՝ յուրաքանչյուր կոնտեքստ հանդիսանում է մյուսի դուստր, բացի հիմնական (context.Background() կամ context.TODO())։
context.Context ինտերֆեյսի հիմնական մեթոդները՝
Deadline() (deadline time.Time, ok bool): Վերադարձնում է կոնտեքստի վերջնաժամկետը։Done() <-chan struct{}: Վերադարձնում է ալիք, որը փակվում է կոնտեքստի չեղարկման ժամանակ։Err() error: Վերադարձնում է սխալը, որը հանգեցրել է կոնտեքստի չեղարկմանը։Value(key any) any: Վերադարձնում է արժեքը, կապված բանալիի հետ կոնտեքստում։
Ստեղծվում են context փաթեթի ֆունկցիաներով՝
context.Background(): Հիմնական դատարկ կոնտեքստ, օգտագործվում է որպես հիմք գլխավոր գործընթացի համար։context.TODO(): Օգտագործվում է որպես ժամանակավոր տեղակալ, երբ անհայտ է, թե որ կոնտեքստը պետք է օգտագործել։context.WithCancel(parent Context): Ստեղծում է դուստր կոնտեքստ և չեղարկման ֆունկցիա։context.WithDeadline(parent Context, d time.Time): Ստեղծում է դուստր կոնտեքստ ժամկետով։context.WithTimeout(parent Context, timeout time.Duration): Ստեղծում է դուստր կոնտեքստ ժամանակային սահմանափակմամբ։context.WithValue(parent Context, key, val any): Ստեղծում է դուստր կոնտեքստ արժեքով։
Հիմնական Context իրականացումները՝
emptyCtx: Հիմնական, չեղարկելի և առանց արժեքների։ Օգտագործվում ենBackgroundևTODO։cancelCtx: Պատրաստված է չեղարկման համար։ Բաղկացած է հիմնական կոնտեքստից և չեղարկման ալիքից։timerCtx: Պատրաստված է ժամկետի/ժամանակաչափի համար։ Ունեցում էcancelCtxև ժամացույց։valueCtx: Պատրաստված է արժեքների փոխանցման համար։ Ունեցում է հիմնական կոնտեքստ և բանալի-արժեք զույգեր։
Երբ ծնողական կոնտեքստը չեղարկվում է, ավտոմատ կերպով չեղարկվում են բոլոր դուստրերը։ Սա թույլ է տալիս փոխանցել չեղարկման նշաններ կամ ժամկետներ շղթայով։
Օրինակ՝ context.WithCancel օգտագործելու համար՝
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Ստեղծում է հիմնական կոնտեքստ և չեղարկման ֆունկցիա
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // Գаранտիա է, որ չեղարկում կլինի ծրագրի ավարտին
go func() {
select {
case <-ctx.Done(): // Կապվում է չեղարկման ժամանակ
fmt.Println("Աշխատանքը չեղարկվեց:", ctx.Err())
return
case <-time.After(5 * time.Second): // կամ ավարտվում է 5 վայրկյան հետո
fmt.Println("Աշխատանքը ավարտվեց")
}
}()
// Չեղարկում է կոնտեքստը այլ վայրից
time.Sleep(1 * time.Second)
fmt.Println("Չեղարկում կոնտեքստը...")
cancel()
// Տալ ժամանակ goroutine-ին մշակել չեղարկումը
time.Sleep(100 * time.Millisecond)
}
Օրինակ՝ context.WithValue օգտագործելու համար՝
package main
import (
"context"
"fmt"
)
type userIDKey string
func processRequest(ctx context.Context) {
if userID, ok := ctx.Value(userIDKey("UserID")).(string); ok {
fmt.Println("Ցուցաբերում պահանջի համար User ID:", userID)
} else {
fmt.Println("User ID չի գտնվել կոնտեքստում")
}
}
func main() {
ctx := context.WithValue(context.Background(), userIDKey("UserID"), "12345")
processRequest(ctx)
}
Կոնտեքստերը անվտանգ են բազմաթելային և անփոփոխ, ինչը կարևոր է մրցակցային կոդի համար։ Դրանք նախատեսված չեն ֆունկցիայի անօգուտ պարամետրեր փոխանցելու համար, այլ՝ մետա-տեղեկատվության, որը ազդում է գործընթացի կատարմանը։