Ответ
При старте горутины важно учитывать:
- Утечки горутин - всегда должен быть механизм остановки (через каналы, context или sync.WaitGroup)
- Паники - неотловленные паники в горутине крашат всю программу
- Передача параметров - передавайте параметры явно, не полагайтесь на замыкания (может быть race condition)
Пример безопасного запуска:
func worker(ctx context.Context, wg *sync.WaitGroup, param int) {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
default:
// работа
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
wg.Add(1)
go worker(ctx, &wg, 42)
// ...
cancel() // сигнал остановки
wg.Wait() // ожидание завершения
}