V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kashin0116
V2EX  ›  Go 编程语言

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

  •  
  •   kashin0116 · 2022-06-06 14:08:34 +08:00 · 1496 次点击
    这是一个创建于 910 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 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 条回复    2022-06-06 14:50:14 +08:00
    Buges
        1
    Buges  
       2022-06-06 14:35:04 +08:00 via Android
    close 是通知接收端发送已经结束的一种方式,如果你不需要或无法直接通知,那自然可以不用 close 。
    你这个例子里有多个地方发送,谁也不知道什么时候结束,自然没法直接 close ,需要其他的方式通知。
    还有一些情况如提前知道接受的数量,那自然也不用 close 。
    seers
        2
    seers  
       2022-06-06 14:44:05 +08:00 via Android
    go 官方文档里面提过 channel 通常不必关闭,例子里面没有合适的时机关闭,否则会 panic ,所以就干脆不关
    kashin0116
        3
    kashin0116  
    OP
       2022-06-06 14:49:44 +08:00
    @Buges 谢谢!看漏掉了下面 loop 里还会利用这个 chan 。
    ```
    go func(link string) {
    worklist <- crawl(link)
    }(link)
    ```
    kashin0116
        4
    kashin0116  
    OP
       2022-06-06 14:50:14 +08:00
    @seers 谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5865 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.