Проходим собеседование на GoLang - разработчика
  • Введение
  • Общие вопросы
  • ✏️Шпаргалка по синтаксису GoLang
  • 📖GoLang теория
    • Типы данных
    • Строки
    • Массивы и слайсы
    • Мапы
    • Каналы
    • Goрутины
    • Гонка данных
    • Мьютексы
    • Контекст
    • ООП, интерфейсы
    • Другие вопросы по Go
  • 🚲GoLang Задачи
    • Задачи на строки
    • Задачи на слайсы
    • Задачи на мапы
    • Задачи на указатель
    • HTTP-запросы
    • Задачи про каналы
    • Задачи на интерфесы
    • Задачи на горутины
    • Задачи с БД
    • Задачи на defer
    • Задачи на таймер
    • Задачи на рефакторинг
    • Нерассортированные задачи
  • 🏬Базы данных
    • 🥥SQL (язык запросов)
    • 🍩Индексы
    • 🥞Транзакции
    • ✈️Масштабирование
  • 🚆Протоколы HTTP/UDP/TCP и т.д.
  • 🛞Алгоритмы
  • 🖥️Операционные системы
  • 🚢Сисдиз
  • 🤪Управление командой
Powered by GitBook
On this page
  1. GoLang теория

Контекст

Зачем нужен контекст в Go?

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

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

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

  2. Установка сроков выполнения: Контекст позволяет устанавливать сроки выполнения операций, что полезно для предотвращения долгих или бесконечных операций.

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

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

Что такое context switch в Go?

Контекстное переключение (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

Примеры работы с контекстом Go

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

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

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)
        }
    }
}
  1. Установка таймаута для запроса:

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)
}
  1. Передача данных через контекст:

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/

PreviousМьютексыNextООП, интерфейсы

Last updated 11 months ago

📖