为什么我需要对 go routine/channel 的结果进行额外的 for 循环以显示所有结果?
Why do I need to do an additional for loop over the results of my go routine/channel to display all results?
代码的快速解释:
- 我正在查看
db.Feeds()
,这是一个 RSS 提要 URL 列表。
- 我正在通过 goroutine
在 getFeeds()
函数中获取提要
getFeeds()
的输出return进入 rss 频道
然后打印RSS信息
func main() {
rss := make(chan feed)
for _, url := range db.Feeds() {
go getFeeds(url, rss)
}
for range db.Feeds() {
newFeed := <-rss
fmt.Println(newFeed.Channel.Title, newFeed.Channel.Description)
}
}
我的问题如下:当我直接打印 newFeed 变量时,它不会显示来自 rss 频道的所有结果,只显示第一个。
我似乎必须遍历 db.Feeds()
(RSS 提要 url 列表)并打印包含 go getFeeds()
的 for 循环的频道结果,以显示所有结果。
为什么会这样?我希望对于范围的每个循环,它会 return 进入 rss 频道并打印结果,而不必第二次超过 db.Feeds()
范围?
任何说明都非常有帮助,我是 Go 新手!喜欢它,但还没有完全理解这门语言的某些方面。
<-channel
运算符使用通道中的单个元素。如果你想继续阅读直到频道关闭,你需要在它上面进行范围。
但是,您需要对频道本身进行测距,而不是 db.Feeds
:
for newFeed := range rss {
fmt.Println(newFeed.Channel.Title, newFeed.Channel.Description)
}
从技术上讲,多次重复读取 newFeed := <-rss
才是真正有效的方法。
目前,这仅适用于您拥有与写入 rss
的元素相同数量的提要。相反,如果元素数量不匹配,您将在读取所有元素之前退出,或者在没有更多元素出现时等待更多。
您还需要某种类型的协调,以确保在所有 getFeeds
功能完成后关闭 rss
频道。
强烈推荐大家围棋,尤其是concurrency section
代码的快速解释:
- 我正在查看
db.Feeds()
,这是一个 RSS 提要 URL 列表。 - 我正在通过 goroutine 在
getFeeds()
的输出return进入 rss 频道然后打印RSS信息
func main() { rss := make(chan feed) for _, url := range db.Feeds() { go getFeeds(url, rss) } for range db.Feeds() { newFeed := <-rss fmt.Println(newFeed.Channel.Title, newFeed.Channel.Description) } }
getFeeds()
函数中获取提要
我的问题如下:当我直接打印 newFeed 变量时,它不会显示来自 rss 频道的所有结果,只显示第一个。
我似乎必须遍历 db.Feeds()
(RSS 提要 url 列表)并打印包含 go getFeeds()
的 for 循环的频道结果,以显示所有结果。
为什么会这样?我希望对于范围的每个循环,它会 return 进入 rss 频道并打印结果,而不必第二次超过 db.Feeds()
范围?
任何说明都非常有帮助,我是 Go 新手!喜欢它,但还没有完全理解这门语言的某些方面。
<-channel
运算符使用通道中的单个元素。如果你想继续阅读直到频道关闭,你需要在它上面进行范围。
但是,您需要对频道本身进行测距,而不是 db.Feeds
:
for newFeed := range rss {
fmt.Println(newFeed.Channel.Title, newFeed.Channel.Description)
}
从技术上讲,多次重复读取 newFeed := <-rss
才是真正有效的方法。
目前,这仅适用于您拥有与写入 rss
的元素相同数量的提要。相反,如果元素数量不匹配,您将在读取所有元素之前退出,或者在没有更多元素出现时等待更多。
您还需要某种类型的协调,以确保在所有 getFeeds
功能完成后关闭 rss
频道。
强烈推荐大家围棋,尤其是concurrency section