golang tour webcrawler练习的简单解决方案

golang tour webcrawler练习的简单解决方案,go,concurrency,channel,Go,Concurrency,Channel,我是新手,我看到了这个练习的一些解决方案,但我认为它们很复杂 在我的解决方案中,一切看起来都很简单,但我有一个死锁错误。我不知道如何正确地关闭通道和停止主块内的循环。有没有一个简单的方法可以做到这一点 感谢您提供的任何/所有帮助 主程序包 进口( “fmt” “同步” ) 类型获取程序接口{ //Fetch返回URL和 //在该页面上找到的URL片段。 获取(url字符串)(正文字符串,url[]字符串,错误) } 类型安全缓存结构{ 缓存映射[字符串]布尔 多路复用器同步。互斥 } func

我是新手,我看到了这个练习的一些解决方案,但我认为它们很复杂

在我的解决方案中,一切看起来都很简单,但我有一个死锁错误。我不知道如何正确地关闭通道和停止主块内的循环。有没有一个简单的方法可以做到这一点

感谢您提供的任何/所有帮助

主程序包
进口(
“fmt”
“同步”
)
类型获取程序接口{
//Fetch返回URL和
//在该页面上找到的URL片段。
获取(url字符串)(正文字符串,url[]字符串,错误)
}
类型安全缓存结构{
缓存映射[字符串]布尔
多路复用器同步。互斥
}
func(c*安全缓存)集(s字符串){
c、 mux.Lock()
c、 缓存[s]=true
c、 mux.Unlock()
}
func(c*SafeCache)Get(s字符串)bool{
c、 mux.Lock()
延迟c.mux.Unlock()
返回c.cache[s]
}
变量(
sc=SafeCache{cache:make(map[string]bool)}
错误,ress=make(chan错误),make(chan字符串)
)
//爬网使用抓取器进行递归爬网
//以url开头的页面,最大深度。
func爬网(url字符串、深度int、抓取器){
如果深度您可以使用

  • 您可以在单独的Goroutine中开始收听您的频道
  • WaitGroup
    将协调您有多少个goroutine
  • wg.Add(1)
    说我们将开始新的goroutine

    wg.Done()
    表示goroutine已经完成

    wg.Wait()

    这三种方法允许您协调goroutine


    另外,您可能对您的
    SafeCache

    感兴趣,也许我需要从
    fakeFetcher
    中提取有用的信息,就像没有更多的URL可获取,我需要关闭频道一样?非常感谢!非常优雅的解决方案!