Горутины выполняют запросы и отправляют результат в канал, а основная горутина печатает его. Закрывать канал нужно после завершения всех отправителей.
2. Модифицируйте программу таким образом, чтобы использовались каналы для коммуникации основного потока с горутинами. Пример:
Горутины выполняют запросы и отправляют результат в канал, а основная горутина печатает его. Закрывать канал нужно после завершения всех отправителей.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
- Модифицируйте программу таким образом, чтобы использовались каналы для коммуникации основного потока с горутинами. Пример: Запросы по списку выполняются в горутинах. Печать результатов на экран происходит в основном потоке
Напишите программу, которая:
- Поочередно выполнит http запросы по предложенному списку ссылок • в случае получения http-кода ответа на запрос "200 OK" печатаем на экране "адрес url - ok" • в случае получения http-кода ответа на запрос отличного от "200 OK" либо в случае ошибки печатаем на экране "адрес url - not ok"
Ответ
Горутины выполняют запросы и отправляют результат в канал, а основная горутина печатает его. Закрывать канал нужно после завершения всех отправителей.
В условии сначала упомянута последовательность, но модификация требует горутины. Ниже запросы конкурентные, вывод идёт по готовности.
package main
import (
"fmt"
"net/http"
"sync"
"time"
)
type result struct { url string; ok bool }
func main() {
urls := []string{"https://example.com", "https://example.org"}
client := &http.Client{Timeout: 5 * time.Second}
results := make(chan result)
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
resp, err := client.Get(url)
ok := false
if err == nil {
ok = resp.StatusCode == http.StatusOK
resp.Body.Close()
}
results <- result{url, ok}
}(url)
}
go func() { wg.Wait(); close(results) }()
for r := range results {
status := "not ok"
if r.ok { status = "ok" }
fmt.Printf("%s - %s\n", r.url, status)
}
}
Для большого списка ограничьте конкурентность. Если важен исходный порядок печати, передавайте индекс и собирайте результаты перед выводом. Ссылки в примере заменяют отсутствующий конкретный список.