原题目:Exercise: Web Crawler
中文原题目可以参看:练习:Web 爬虫
// Crawl 使用 fetcher 从某个 URL 开始递归的爬取页面,直到达到最大深度。
func Crawl(url string, depth int, fetcher Fetcher) {
// TODO: 并行的抓取 URL。
// TODO: 不重复抓取页面。
// 下面并没有实现上面两种情况:
这个题里需要处理的
- 协程间同步的问题。使用无缓冲信道进行协程同步处理,进行并行抓取;
- 协程安全sync.Mutex的使用,可以参考golang A Tour of Go:sync.Mutex
实现代码如下:
...
type safeState struct {
v map[string]bool
mux sync.Mutex
}
func (c *safeState) setState(key string, state bool) {
c.mux.Lock(