После выполнения цикла заканчивается работа горутины и не отправляет полученные значения в канал
Мой код заключается в взаимодействии горутин, одна стаскивает адреса страниц, содержащих инфу о персонажах, другая подхватывает и проходится по каждой, собирая информацию. Когда она прошлась по всем полученным страницам она должна отправить в канал список заполненных инфой структур.
Вот код:
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
}
Некоторые в коде пока не используются, но скинул на всякий случай.