Golang频道不要关闭
Golang channel do not close
我不明白,为什么频道没有关闭。
我使用 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://whosebug.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 成功读取 link 时,它会打印
is up!
消息,并开始等待写入通道。主 goroutine 等待所有 goroutines 退出,然后关闭通道并从中读取。此时,所有的goroutines都睡着了。
- 您正在关闭频道,并从中读取。这将立即 return 零值,即“”
- 如果从 link 读取失败,您的 goroutines 将 return 不调用
wg.Done()
。
要修复,请使用:
go func() {
wg.Wait()
close(c)
}()
我不明白,为什么频道没有关闭。
我使用 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://whosebug.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 成功读取 link 时,它会打印
is up!
消息,并开始等待写入通道。主 goroutine 等待所有 goroutines 退出,然后关闭通道并从中读取。此时,所有的goroutines都睡着了。 - 您正在关闭频道,并从中读取。这将立即 return 零值,即“”
- 如果从 link 读取失败,您的 goroutines 将 return 不调用
wg.Done()
。
要修复,请使用:
go func() {
wg.Wait()
close(c)
}()