У меня проблема тупика, которую я не могу решить.
У меня есть несколько URL-адресов, и каждый URL-адрес в goroutine принесет мне достаточно данных.Эти данные я выкладываю в один канал.Но если я закрываю канал, программа не работает, если я оставляю канал открытым, появляется тупик.
Я не знаю, как решить, у кого-то будет решение
Ниже я ставлюзадача в упрощенном виде
package main
import (
"fmt"
)
type urlNumbers struct {
url string
numbers []int
}
func getNumbers(urls []urlNumbers) chan int {
ch := make(chan int)
for _, url := range urls {
go allNumbersOfURL(url, ch)
}
return ch
}
func allNumbersOfURL(url urlNumbers, ch chan int) {
for _, i := range url.numbers {
ch <- i
}
}
func main() {
url1 := urlNumbers {url: "1", numbers: []int{1, 2, 3}}
url2 := urlNumbers {url: "2", numbers: []int{4, 5, 6}}
url3 := urlNumbers {url: "3", numbers: []int{7, 8, 9}}
url4 := urlNumbers {url: "4", numbers: []int{10, 11, 12}}
c := getNumbers([]urlNumbers{url1, url2, url3, url4})
for i := range c {
fmt.Println(i)
}
fmt.Println("END")
}
Вывод
go run app.go
10
11
12
4
7
1
2
3
5
6
8
9
fatal error: all goroutines are asleep - deadlock!