Вопрос проверяет понимание модели конкурентности в Go, механизма работы горутин и способов их завершения. Он показывает, знает ли кандидат про context, каналы и почему в языке нет «kill goroutine».
В Go нельзя напрямую убить горутину, потому что это сломало бы модель безопасности и могло оставить память в неконсистентном состоянии. Обычно используют context или каналы, через которые горутина получает сигнал «завершиться».
Горутины в Go — лёгкие потоки, управляемые рантаймом. У языка нет примитива типа kill(goroutine), потому что насильное завершение могло бы оставить общий объект в полусостоянии и вызвать гонки данных.
Правильный способ — организация кооперативного завершения:
Прокидывается context.Context в каждую горутину.
Внутри делается select { case <-ctx.Done(): return }.
Родитель при необходимости вызывает cancel().
Пример:
ctx, cancel := context.WithCancel(context.Background())
go func() {
for {
select {
case <-ctx.Done():
fmt.Println("worker stopped")
return
default:
// полезная работа
}
}
}()
time.Sleep(time.Second)
cancel()Вывод: управление временем жизни горутин всегда должно быть явным, через context или каналы.