为什么我需要对 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?

代码的快速解释:

我的问题如下:当我直接打印 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