最近在看 gopl ,对第八章这个 crawl 的代码有个小小的问题。
func crawl(url string) []string {
fmt.Println(url)
list, err := links.Extract(url)
if err != nil {
log.Print(err)
}
return list
}
//!-crawl
//!+main
func main() {
worklist := make(chan []string)
// Start with the command-line arguments.
go func() { worklist <- os.Args[1:] }() // 为啥不需要 close buffer
// Crawl the web concurrently.
seen := make(map[string]bool)
for list := range worklist {
for _, link := range list {
if !seen[link] {
seen[link] = true
go func(link string) {
worklist <- crawl(link)
}(link)
}
}
}
}
go func() { worklist <- os.Args[1:] }()
这里应该是定义 unbuffered channel out 的一端,我看前面的示例对于 out 都要及时的 close ,这里似乎没有。
求指教。
1
Buges 2022-06-06 14:35:04 +08:00 via Android
close 是通知接收端发送已经结束的一种方式,如果你不需要或无法直接通知,那自然可以不用 close 。
你这个例子里有多个地方发送,谁也不知道什么时候结束,自然没法直接 close ,需要其他的方式通知。 还有一些情况如提前知道接受的数量,那自然也不用 close 。 |
2
seers 2022-06-06 14:44:05 +08:00 via Android
go 官方文档里面提过 channel 通常不必关闭,例子里面没有合适的时机关闭,否则会 panic ,所以就干脆不关
|
3
kashin0116 OP |
4
kashin0116 OP @seers 谢谢!
|