2. Модифицируйте программу таким образом, чтобы использовались каналы для коммуникации основного потока с горутинами. Пример:

Горутины выполняют запросы и отправляют результат в канал, а основная горутина печатает его. Закрывать канал нужно после завершения всех отправителей.

Короткий ответ

Что ответить на собеседовании

Горутины выполняют запросы и отправляют результат в канал, а основная горутина печатает его. Закрывать канал нужно после завершения всех отправителей.

Подробный разбор

Ответ с пояснениями

Условие

  1. Модифицируйте программу таким образом, чтобы использовались каналы для коммуникации основного потока с горутинами. Пример: Запросы по списку выполняются в горутинах. Печать результатов на экран происходит в основном потоке

Напишите программу, которая:

  1. Поочередно выполнит 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)
    }
}

Для большого списка ограничьте конкурентность. Если важен исходный порядок печати, передавайте индекс и собирайте результаты перед выводом. Ссылки в примере заменяют отсутствующий конкретный список.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее