Go 指南 練習 Web 爬蟲

2021-09-24 22:56:05 字數 1371 閱讀 2515

在這個練習中,我們將會使用 go 的併發特性來並行化乙個 web 爬蟲。

修改crawl函式來並行地抓取 url,並且保證不重複。

提示:你可以用乙個 map 來快取已經獲取的 url,但是要注意 map 本身並不是併發安全的!

在網路上已經能找到好幾種答案了,有的甚至用上了通道(channel)來幫助實現。我在這裡提供的是一種簡單明瞭的實現:

package main

import (

"fmt"

"sync"

)type fetcher inte***ce

type urlrecord struct

var m = urlrecord

// crawl 使用 fetcher 從某個 url 開始遞迴的爬取頁面,直到達到最大深度。

func crawl(url string, depth int, fetcher fetcher)

m.mux.lock()

m.v[url]++

m.mux.unlock()

body, urls, err := fetcher.fetch(url)

if err != nil

fmt.printf("found: %s %q\n", url, body)

for _, u := range urls

m.mux.unlock()

} return

}func main()

// fakefetcher 是返回若干結果的 fetcher。

type fakefetcher map[string]*fakeresult

type fakeresult struct

func (f fakefetcher) fetch(url string) (string, string, error)

return "", nil, fmt.errorf("not found: %s", url)

}// fetcher 是填充後的 fakefetcher。

var fetcher = fakefetcher,

}, "": &fakeresult,

}, "fmt/": &fakeresult,

}, "os/": &fakeresult,

},}

程式輸出如下:

found: "the go programming language" 

not found: cmd/

found: "packages"

found: os/ "package os"

found: fmt/ "package fmt"

program exited.

go語言指南的練習

對照著指南學習golang 然後做練習題,這裡是來自於其他同學總結的練習的參 然後想要補充分享是在的練習題中提出的 為什麼fmt.sprint e 會使程式陷入死迴圈的 func e errnegativesqrt error string或者 func e errnegativesqrt erro...

Go指南練習(2) slice

實現函式pic,它返回乙個長度為dy的slice,其每個元素是長度為dx 型別為8位無符號整數的slice slice巢狀 當你執行函式pic時,它會把每個slice元素作為對應畫素的灰度值 好吧,其實是藍度 並顯示整個slice對應的影象。計算每個畫素灰度值的方法由你決定,可能用到的方法有 x y...

Go指南練習 迴圈與函式

源位址 為了練習函式與迴圈,我們來實現乙個平方根函式 用牛頓法實現平方根函式。計算機通常使用迴圈來計算 x 的平方根。從某個猜測的值 z 開始,我們可以根據 z 與 x 的近似度來調整 z,產生乙個更好的猜測 z z z x 2 z 重複調整的過程,猜測的結果會越來越精確,得到的答案也會盡可能接近實...