0
我試圖寫入頻道作爲goroutine函數中的最後一個操作。在寫入頻道時延遲從未打電話
不幸的是,這是行不通的。而waitGroup從未完成。
import (
"sync"
"github.com/SlyMarbo/rss"
"fmt"
)
func main() {
urls := []string{"http://rss.cnn.com/rss/edition.rss", "http://rss.time.com/web/time/rss/top/index.xml"}
var c = make(chan string)
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go receiveRss(url, &wg, c)
}
wg.Wait()
fmt.Println("==============DONE=================")
}
func receiveRss(url string, wg *sync.WaitGroup, c chan string) {
defer wg.Done()
feed, err := rss.Fetch(url)
if err != nil {
fmt.Println("Failed to retrieve RSS feed", err)
}
items := feed.Items
for _, item := range items {
c <- item.Title
}
}
當更換c <- item.Title
與fmt.Println(item.Title)
遞延函數被調用和DONE被打印。
你沒有什麼從'C'接收。 – JimB
爲了詳細說明@JimB的評論,所有你的go-routines在'c < - item.Title'上被阻塞,因爲沒有任何東西正在讀取頻道,所以他們永遠不會完成,延遲也不會被調用,所以主要的塊等待'WaitGroup'。 – RayfenWindspear
@MarcelCliff和你添加之後 - 'c'永遠不會關閉,所以'title:= range c'永遠被阻塞。 – zerkms