Junior
რა არის კონტექსტი Go-ში?
sobes.tech AI
პასუხი AI-სგან
Go тилиндеги (context.Context) объект — бул, ал белгилүү бир убакытка чейин иштөө мөөнөтүн, жокко чыгаруу сигналын (cancellation signal) жана суроо-талабга тиешелүү маалыматтарды алып жүрөт. Ал горутиндердин жашоо циклин башкаруу жана алардын ортосунда маалымат алмашуу үчүн колдонулат.
Негизги өзгөчөлүктөрү:
- Тиркемелерге коопсуз: Горутиндер ортосунда коопсуз өткөрүлүшү мүмкүн.
- Иммутабель: Бир жолу түзүлгөндөн кийин,
Contextөзгөртүлбөйт. Мураскор контексттер ата-эне негизинде түзүлөт. - Иерархиялык: Контексттер дарак түзөт, тамыры (
context.Background()жеcontext.TODO()) менен. Ата-эне контекстин жокко чыгаруу бардык балдарын жокко чыгарат.
context пакети негизги функциялары:
context.Background(): Бош контекст, көбүнчө негизги функцияда, жогорку деңгээлдеги суроолордо же тесттерде колдонулат. Эч качан жокко чыгарылбайт.context.TODO(): Ошондой эле бош контекст. Кайда колдонуу керектиги белгисиз учурда, же контексттин функционалдуулугу ишке ашырылбаган учурда колдонулат.context.WithCancel(parent Context): Жаңы балдар контекстин жана жокко чыгаруу функциясын кайтарат. Жокко чыгаруу функциясын чакырганда, бул контекст жана анын бардык балдары жокко чыгат.context.WithDeadline(parent Context, deadline time.Time): Връща дъщерен контекст, който автоматично се отменя, когато настъпи посоченото време. Връща също така функция за ръчно отмяна.context.WithTimeout(parent Context, timeout time.Duration): Същото катоWithDeadline, но с указание за продължителност.context.WithValue(parent Context, key, val interface{}): Връща дъщерен контекст с променена стойност по ключ.
Приложение:
- Отмяна на операции: Например, таймаут на HTTP заявка или прекъсване на дълга операция.
- Пренасяне на данни: Например, ID на заявката за логиране, автентификационна информация.
Пример за използване на context.WithTimeout:
package main
import (
"context"
"fmt"
"time"
)
func longRunningOperation(ctx context.Context, resultChan chan string) {
select {
case <-time.After(3 * time.Second):
// Операцията е успешно завършена
resultChan <- "Operation completed"
case <-ctx.Done():
// Контекстът е отменен
err := ctx.Err() // Получаване на причината за отмяна
resultChan <- fmt.Sprintf("Operation cancelled: %v", err)
}
}
func main() {
// Създаване на контекст с таймаут 2 секунди
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // Гарантирано извикване на функцията за отмяна
resultChan := make(chan string, 1)
go longRunningOperation(ctx, resultChan)
// Изчакване за резултат или отказ
select {
case res := <-resultChan:
fmt.Println(res)
case <-ctx.Done():
fmt.Printf("Main context done: %v\n", ctx.Err())
}
// Малко изчакване, за да може горутината да приключи, ако е била отменена
time.Sleep(1 * time.Second)
}
В този пример longRunningOperation проверява за отказ на контекста. Ако таймаутът на основния контекст (2 секунди) изтече преди да приключи операцията (3 секунди), горутината получава сигнал за отказ чрез ctx.Done() и приключва.