V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kashin0116

Go 初学者请教一个 channel 的 问题

  •  
  •   kashin0116 · Jun 6, 2022 · 2216 views
    This topic created in 1420 days ago, the information mentioned may be changed or developed.

    最近在看 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 ,这里似乎没有。

    求指教。

    4 replies    2022-06-06 14:50:14 +08:00
    Buges
        1
    Buges  
       Jun 6, 2022 via Android
    close 是通知接收端发送已经结束的一种方式,如果你不需要或无法直接通知,那自然可以不用 close 。
    你这个例子里有多个地方发送,谁也不知道什么时候结束,自然没法直接 close ,需要其他的方式通知。
    还有一些情况如提前知道接受的数量,那自然也不用 close 。
    seers
        2
    seers  
       Jun 6, 2022 via Android
    go 官方文档里面提过 channel 通常不必关闭,例子里面没有合适的时机关闭,否则会 panic ,所以就干脆不关
    kashin0116
        3
    kashin0116  
    OP
       Jun 6, 2022
    @Buges 谢谢!看漏掉了下面 loop 里还会利用这个 chan 。
    ```
    go func(link string) {
    worklist <- crawl(link)
    }(link)
    ```
    kashin0116
        4
    kashin0116  
    OP
       Jun 6, 2022
    @seers 谢谢!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   938 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:39 · PVG 06:39 · LAX 15:39 · JFK 18:39
    ♥ Do have faith in what you're doing.