0
私はゴルーチン関数の最後のアクションとしてチャンネルに書き込もうとしています。チャンネルに書き込むときにDeferが呼び出されない
残念ながら、これは機能しません。そして、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
}
}
fmt.Println(item.Title)
とc <- item.Title
と呼ば行われる遅延機能を置き換える印刷されます。
あなたがC ' 'からの受信は何もありません。 – JimB
@JimBのコメントを詳述するために、チャンネルから何も読んでいないので、完了しないでdeferが呼び出されることはないので、すべてのあなたのgo-routinesは 'c
RayfenWindspear
@MarcelCliffを追加した後、 'c'は決して閉じられません。' for title:= range c'は永遠にブロックされます。 – zerkms