Go тилинде контексттер кандайча түзүлгөн?
sobes.tech AI
AIден жооп
context (context.Context) Go'до колдонулат 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() // Main чыгуу алдында жокко чыгарууну камсыз кылуу
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()
// Горутинага жокко чыгарууну иштетүүгө убакыт берүү
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)
}
Контексттер жиптерге коопсуз жана өзгөртпөйт, бул конкуренциялык код үчүн маанилүү. Алар функциянын түз параметрлерин өткөрүүгө арналган эмес, көбүнчө процесстин аткарылышына таасир этүүчү мета-маалыматтар үчүн колдонулат.