> Как прервать выполнение goroutine без остановки главной программы в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: InDrive

Стек: Go

> Пример ответа

В Go для безопасного прерывания выполнения goroutine извне без остановки главной программы используется паттерн с каналом для сигнала завершения (done channel). Основная идея - передать в goroutine канал, который закрывается, когда нужно остановить её выполнение. Goroutine периодически проверяет этот канал через select.

Пример:

GO
package main
import (
"fmt"
"time"
)
func worker(done <-chan struct{}) {
for {
select {
case <-done:
fmt.Println("Горутина завершена")
return
default:
// Выполнение полезной работы
fmt.Println("Работаю...")
time.Sleep(500 * time.Millisecond)
}
}
}
func main() {
done := make(chan struct{})
go worker(done)
time.Sleep(2 * time.Second)
close(done) // Сигнал завершения
time.Sleep(1 * time.Second)
fmt.Println("Главная программа продолжает работу")
}

Здесь done - небуферизированный канал пустой структуры. Когда главная программа вызывает close(done), все горутины, ожидающие чтения из этого канала, получают нулевое значение и могут корректно завершиться. Главная программа при этом не блокируется и продолжает выполнение. Этот подход гарантирует отсутствие утечек горутин и позволяет управлять их жизненным циклом.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью