Golang频道不关闭[关闭]

问题描述 投票:-4回答:1
我不明白,为什么频道没有关闭。我使用Waitgroup显式等待并在其关闭之后关闭通道...但是程序不会退出。谢谢您的帮助

([https://play.golang.org/p/lto2DytWH13

package main import ( "fmt" "net/http" "sync" ) var wg sync.WaitGroup func main() { links := []string{ "http://google.com", "http://facebook.com", "http://stackoverflow.com", "http://golang.org", "http://amazon.com", } wg.Add(len(links)) c := make(chan string) for _, link := range links { go checkLink(link, c, &wg) } wg.Wait() close(c) for u := range c { fmt.Println(u) } } func checkLink(link string, c chan string, wg *sync.WaitGroup) { _, err := http.Get(link) if err != nil { fmt.Println(link, "might be down!") c <- link return } fmt.Println(link, "is up!") c <- link wg.Done() }

go channel goroutine
1个回答
4
投票
这是程序的问题:

    当goroutine成功读取链接时,它将打印is up!消息,并开始等待写入通道。主goroutine等待所有goroutine退出,然后关闭通道并从中读取。此时,所有goroutine都处于睡眠状态。
  • 您正在关闭频道,并从中读取内容。这将立即返回零值,即““
  • 如果从链接读取失败,您的goroutine将返回而不调用wg.Done()
  • 要解决,请使用:

    go func() { wg.Wait() close(c) }()

  • © www.soinside.com 2019 - 2024. All rights reserved.