you_are_enot
@you_are_enot
Пограммист любитель

Как корректно завершить горутину в случае ошибки?

Я запускаю пачку горутин внутри которых обращаюсь к удалённому api.
// Функция main

        in := make(chan [][]UserData, 0)
	defer close(in)


	go func() {
		for _, url := range urls {
			go getUsersData(url, in)
			time.Sleep(time.Millisecond * 50)
		}
	}()

	var usersData []UserData
	for i := 0; i < len(urls); i++ {
		result := <-in
		for _, v := range result {
			usersData = append(usersData, v...)
		}
	}
        
        // ...


// Горутина (Функция getUsersData)

        resp, err := http.Get(url)
	if err != nil {
		return
	}
	defer resp.Body.Close()

	u := &usersDataResponse{}
	if err := json.NewDecoder(resp.Body).Decode(u); err != nil {
                // ?
		return
	}

	if u.Error.ErrorCode != 0 {
		// ?
		return 
	}

	out <- u.Response


Как в случае возникновения ошибки внутри горутины продолжить работу основной программы?
  • Вопрос задан
  • 428 просмотров
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
оптимальным будет сделать тип канала
type Result struct {
  Payload []UserData
  Error error
}
in := make(chan Result, len(urls))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы