go - Golang 频道不关闭
问题描述
我不明白,为什么频道没有关闭。我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()
}
解决方案
以下是您的程序存在的问题:
- 当 goroutine 成功读取链接时,它会打印
is up!
消息,并开始等待写入通道。主 goroutine 等待所有 goroutine 退出,然后关闭通道并从中读取。此时,所有的 goroutine 都处于休眠状态。 - 您正在关闭频道并从中读取。这将立即返回零值,即“”
wg.Done()
如果从链接读取失败,您的 goroutine 将返回而不调用。
要修复,请使用:
go func() {
wg.Wait()
close(c)
}()
推荐阅读
- swift - 如何使用 OnTapGesture 事件播放我的抽奖动画?
- jenkins - Jenkins JNLP 端口暴露内部 ip
- iis - 发布到 IIS 的 Blazor 服务器应用程序获取您的连接不是私有的
- python - 如何使用 yattag 库输出 CDATA
- karate - 空手道:匹配 JSON 数组响应,其中每次命中的数组顺序不同
- android - 如何在Android中排除jar文件?
- c# - Xml Root.add 带有特殊字符的值(:)
- powerapps - 具有从集合自动生成的多个列表框的图库
- sql - 如何计算一个月的产品库存量为0的天数?(奥多)
- scala - 如何检查集合中的某些期货是否失败