最近在看 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 谢谢! |