Ответ
В Go нет прямого способа завершить горутины извне. Рекомендуется использовать каналы или контексты для graceful shutdown:
func worker(stopCh <-chan struct{}) {
for {
select {
case <-stopCh:
return // завершаем горутину
default:
// работа
}
}
}
func main() {
stopCh := make(chan struct{})
go worker(stopCh)
// когда нужно завершить
close(stopCh) // сигнал всем горутинам
}
Или с context:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
// работа
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// завершение
cancel()
}
Важно: горутины должны сами проверять сигналы завершения. Можно использовать sync.WaitGroup для ожидания завершения.