Вопрос проверяет понимание обработки ошибок в конкурентном коде Go, а именно как корректно передавать ошибки из горутин в основной поток выполнения.
В Go горутины выполняются асинхронно, поэтому ошибки, возникшие внутри них, не могут быть обработаны напрямую в вызывающем коде. Игнорирование ошибок в горутинах приводит к непредсказуемому поведению и трудно отлаживаемым багам. Основной подход — использовать каналы для передачи ошибок из горутины в основной поток.
package main
import (
"fmt"
"net/http"
)
func fetchURL(url string, errCh chan<- error) {
resp, err := http.Get(url)
if err != nil {
errCh <- err
return
}
defer resp.Body.Close()
// обработка ответа...
errCh <- nil
}
func main() {
errCh := make(chan error, 1)
go fetchURL("https://example.com", errCh)
if err := <-errCh; err != nil {
fmt.Println("Ошибка:", err)
} else {
fmt.Println("Успех")
}
}Передача ошибок через каналы — стандартный и надёжный способ обработки ошибок в горутинах Go. Этот подход обеспечивает синхронизацию и позволяет централизованно реагировать на сбои, что особенно важно при выполнении HTTP-запросов и других операций ввода-вывода.