После выполнения цикла заканчивается работа горутины и не отправляет полученные значения в канал

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

Вот код:

package main

import (
    "strings"
    "fmt"
    "log"
    "path"
    "github.com/PuerkitoBio/goquery"
    "net/http"
)

func getGoqueryDocumentByURL(url string) (*goquery.Document, error) {
    request, err := http.Get(url)
    if err != nil { return nil, err }
    defer request.Body.Close()

    document, err := goquery.NewDocumentFromReader(request.Body)
    if err != nil { return nil, err }

    return document, nil
}

func getChampionsPages(championPagesChannel chan string) {
    document, err := getGoqueryDocumentByURL(MonitoringPage)
    if err != nil { log.Fatal(err) }
        
    document.Find(ChampionsSelector).Each(
        func(index int, item *goquery.Selection) {
            championPageURL, presence := item.Attr("href")
            if presence {
                championPagesChannel <- MonitoringPage +
                 path.Base(championPageURL)
            }
        },
    )
}

func getChampionsData(championsPagesChannel chan string, championsChannel chan []Champion) {
    var champions []Champion

    for championURL := range championsPagesChannel {
        var champion Champion

        doc, err := getGoqueryDocumentByURL(championURL)
        if err != nil { log.Fatal(err) }
                    
        champion.Name       = doc.Find(".iLTyui span").Text()
        champion.Role       = doc.Find(".ieHviE").First().Text()
        champion.Complexity = doc.Find(".ieHviE").Last().Text()
        champion.Info       = strings.Replace(doc.Find(".hZPZqS p").Text(), "Подробнее", "", 1)

        fmt.Println(champion.Name)

        champions = append(champions, champion)
    }
    fmt.Println(champions) // уже не работает.

    championsChannel <- champions
}

func retrievingChampionsInformationProcessor() {
    championsPagesChannel := make(chan string)
    go getChampionsPages(championsPagesChannel)
    
    championsChannel := make(chan []Champion)
    for i := 0; i < Workers; i++ {
        go getChampionsData(championsPagesChannel,
             championsChannel)
    }

    champs := <- championsChannel
    fmt.Println(champs)
}

В коде комментарием отмечен момент, который уже не работает. У меня есть догадка, что горутина, собиравшая адреса страниц к окончанию цикла блокируется и не дает продолжить последующее выполнения кода, но я никак не могу пофиксить.(не стоит обращать внимание на то, что я не возвращаю ошибки, а просто логгирую их. Это начальный этап разработки.)

Вот необходимые данные для тестинга кода:


const (
    ChampionsSelector = ".style__Item-ntddd-3"
    MonitoringPage    = "https://ru.leagueoflegends.com/ru-ru/champions/"
    Workers           = 3
)

Структуры:

type Skin struct {
    Name, PathToImage string 
}

type Skill struct {
    Using, Name, Description, PathToDemonstration string
}

type Champion struct {
    Name, Complexity, Info, Role string
    Skills                       []Skill
    Skins                        []Skin
}

Некоторые в коде пока не используются, но скинул на всякий случай.


Ответы (0 шт):