receiptCount)
errChan := make(chan error)
for i := uint(0); i < receiptCount; i++ {
go func(i uint) {
receipt, err := getReceipt()
if err != nil {
errChan <- err
return
}
receipts[i] = receipt
}(i)
}
if err := <-errChan; err != nil {
return nil, err
}
return receipts, nil
я
хочу сделать так, чтобы если хоть одна ошибка была - делался return nil, err
но если ошибок нету, то код зависает на последнем if'е - оно и понятно, ибо ошибок же нету)
наверно надо сделать отдельный канал типа quit и это в селект обернуть
но как мне узнать, что все горутины были выполнены, но чтобы ещё и errChan слушался парралельно?
waitGroup посмотрите
Загугли пакет errgroup
я смотрел) но мне надо одновременно слушать errChan помимо ожидания wg.Wait()
errgroup ожидает первую ошибку и завершает контекст
извините за пинг, но чёт не догоняю как сделать через контекст( я то понял, что нужно делать типа select { case <-ctx.Done: return ctx.Err() } но если ошибок не будет, то опять стопор на этом месте)
А что надо? Подождать, чтобы все завершились?
может вот так? receipts := make([]*types.Receipt, receiptCount) errChan := make(chan error) for i := uint(0); i < receiptCount; i++ { go func(i uint) { receipt, err := getReceipt() if err == nil { receipts[i] = receipt } errChan <- err }(i) } for i := 0; i < receiptCount; i++ { if err := <-errChan; err != nil { return nil, err } } return receipts, nil
о, и правда можно так) спасибо, наверное остановлюсь на этом варианте, самый простой оказался)
Обсуждают сегодня