> For the complete documentation index, see [llms.txt](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/golang-teoriya/kontekst.md).

# Контекст

<details>

<summary>Зачем нужен контекст в Go?</summary>

Контекст (context) в языке программирования Go используется для управления сигналами отмены, сроками выполнения и значениями ключей во время выполнения операций в горутинах. Контекст позволяет передавать эти значения между функциями и горутинами без необходимости передачи дополнительных параметров через цепочку вызовов функций.

Основные причины использования контекста в Go включают:

1. **Отмена операций**: Контекст позволяет безопасно отменять операции в горутинах, предотвращая утечку ресурсов и ненужные вычисления при необходимости прервать выполнение задачи.
2. **Установка сроков выполнения**: Контекст позволяет устанавливать сроки выполнения операций, что полезно для предотвращения долгих или бесконечных операций.
3. **Передача значений ключей**: Контекст также используется для передачи значений ключей, которые могут использоваться для передачи метаданных или другой информации между функциями.

Использование контекста в Go способствует более эффективной и безопасной работы с горутинами, обеспечивая контроль над выполнением операций и передачей значений в многопоточной среде.

</details>

<details>

<summary>Что такое context switch в Go?</summary>

Контекстное переключение (context switch) в Go - это процесс, при котором выполнение процессором одной горутины (или потока) прерывается, а состояние этой горутины сохраняется, чтобы позднее можно было продолжить выполнение с того же места. Контекстное переключение необходимо для эффективного управления параллельными процессами в многозадачных операционных системах и средах программирования.

Когда происходит контекстное переключение в Go, информация о состоянии текущей горутины сохраняется, включая значения регистров, указатели стека и другие необходимые данные. Затем процессор переключает свое выполнение на другую горутину, которая может быть готова к выполнению. После завершения выполнения другой горутины, процессор восстанавливает состояние первой горутины и продолжает выполнение с места, где оно было прервано.

Контекстное переключение в Go позволяет эффективно использовать параллелизм и конкурентность, обеспечивая справедливое распределение ресурсов и управление выполнением горутин. Оно является важной частью механизмов синхронизации и управления горутинами в Go, позволяя программам эффективно использовать многозадачность и параллелизм.

Citations: \[1] <https://www.digitalocean.com/community/tutorials/how-to-write-switch-statements-in-go-ru> \[2] <https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\\_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0> \[3] <https://golangify.com/switch-case> \[4] <https://quizlet.com/ru/870934938/golang-%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B-2-flash-cards/> \[5] <https://rusinfoproduct.ru/cinhronizatsiya-mezhdu-gorutinami-v-yazyke-go>

</details>

<details>

<summary>Примеры работы с контекстом Go</summary>

Контекст в Go является важным инструментом для управления жизненным циклом и отменой выполнения горутин. Вот несколько примеров использования контекста в Go:

1. **Отмена выполнения горутин**:

```go
func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go doWork(ctx)

    // Отменяем контекст через 5 секунд
    time.AfterFunc(5*time.Second, cancel)
    <-ctx.Done()
    fmt.Println("Работа завершена")
}

func doWork(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Работа отменена")
            return
        default:
            // Выполняем работу
            fmt.Println("Выполняю работу...")
            time.Sleep(1 * time.Second)
        }
    }
}
```

2. **Установка таймаута для запроса**:

```go
func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()

    resp, err := http.Get("http://example.com")
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }
    defer resp.Body.Close()

    fmt.Println("Статус:", resp.Status)
}
```

3. **Передача данных через контекст**:

```go
func main() {
    ctx := context.WithValue(context.Background(), "user", "John Doe")
    doSomething(ctx)
}

func doSomething(ctx context.Context) {
    user := ctx.Value("user").(string)
    fmt.Println("Пользователь:", user)
}
```

Эти примеры демонстрируют, как использовать контекст для отмены выполнения горутин, установки таймаута для запросов и передачи данных между горутинами. Контекст является важным инструментом для управления жизненным циклом и координации параллельных операций в Go.

Citations: \[1] <https://eax.me/go-profiling/> \[2] <https://proglib.io/p/samouchitel-po-go-dlya-nachinayushchih-chast-9-struktury-i-metody-interfeysy-ukazateli-osnovy-oop-2024-02-19> \[3] <https://habr.com/ru/companies/badoo/articles/301990/> \[4] <https://dzen.ru/a/ZTwY7e7y3T12novC> \[5] <https://habr.com/ru/companies/vk/articles/463063/>

</details>
