Golang Go语言中初学者请教一个channel的问题
最近在看 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 ,这里似乎没有。
求指教。
Golang Go语言中初学者请教一个channel的问题
更多关于Golang Go语言中初学者请教一个channel的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
close 是通知接收端发送已经结束的一种方式,如果你不需要或无法直接通知,那自然可以不用 close 。
你这个例子里有多个地方发送,谁也不知道什么时候结束,自然没法直接 close ,需要其他的方式通知。
还有一些情况如提前知道接受的数量,那自然也不用 close 。
更多关于Golang Go语言中初学者请教一个channel的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go 官方文档里面提过 channel 通常不必关闭,例子里面没有合适的时机关闭,否则会 panic ,所以就干脆不关
谢谢!看漏掉了下面 loop 里还会利用这个 chan 。 <br>go func(link string) {<br> worklist <- crawl(link)<br>}(link)<br>
你好!很高兴看到你对Go语言的channel感兴趣。在Go语言中,channel是用于在不同的goroutine之间进行通信的一种机制。它们提供了一种安全的方式来传递数据,避免了数据竞争和其他并发问题。
对于初学者来说,理解channel的基本概念和用法是非常重要的。首先,你需要知道如何创建channel,这可以通过使用make
函数来完成,例如:
ch := make(chan int)
这将创建一个可以传递int
类型数据的channel。
接下来,你需要了解如何向channel发送数据和从channel接收数据。这可以通过<-
操作符来完成:
// 发送数据
ch <- 42
// 接收数据
value := <-ch
此外,你还应该了解channel的阻塞行为。当向一个无缓冲的channel发送数据时,如果接收方还没有准备好接收,发送操作将会阻塞。同样,当从一个无缓冲的channel接收数据时,如果发送方还没有准备好发送数据,接收操作也会阻塞。
对于初学者来说,我建议从简单的例子开始,逐步增加复杂性。你可以尝试编写一些小的程序,使用channel在不同的goroutine之间传递数据,并观察它们的行为。这将帮助你更好地理解channel的工作原理和它们在并发编程中的重要性。
希望这些信息对你有所帮助!如果你有其他关于Go语言或channel的问题,欢迎随时提问。