Как создать новый контекст от старого игнорируя прерывание контекста в go?

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

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

Пример использования функции context.WithValue() для создания нового контекста от старого, игнорируя прерывание контекста, выглядит следующим образом:

package main

import (
    "context"
    "fmt"
)

func main() {
    // Создаем старый контекст с отменой
    parent := context.WithCancel(context.Background())

    // Создаем новый контекст от старого игнорируя отмену
    child := context.WithValue(parent, "key", "value")

    // Проверяем значение в новом контексте
    if value := child.Value("key"); value != nil {
        fmt.Println("Значение в новом контексте:", value)
    } else {
        fmt.Println("Значение не найдено в новом контексте")
    }

    // Отменяем старый контекст
    parent.Cancel()

    // Проверяем, что новый контекст не отменен
    if child.Err() != context.Canceled {
        fmt.Println("Новый контекст не был отменен")
    } else {
        fmt.Println("Новый контекст был отменен")
    }
}

В этом примере мы создаем старый контекст parent с отменой. Затем мы создаем новый контекст child от старого, используя функцию context.WithValue(), и устанавливаем значение "value" с ключом "key". Мы проверяем, что значение было добавлено в новый контекст, и затем отменяем старый контекст parent.

Затем мы проверяем, что новый контекст child не был отменен, сравнивая результат функции child.Err() с context.Canceled. Если новый контекст не был отменен, выводится сообщение "Новый контекст не был отменен", иначе выводится сообщение "Новый контекст был отменен".

Ключевым моментом здесь является то, что новый контекст child сохраняет значение "value", даже после того, как старый контекст parent был отменен. Это позволяет передавать контекст на следующий уровень выполнения кода, игнорируя прерывание контекста и сохраняя некоторые его аспекты.