UPD : 結局のところ、Go でのエラー処理に関する質問です。
「メイン スレッド」で Web ページのアドレスを生成し、1 つの go-routine で実際のページを取得し、コンテンツを 経由で返しchan
、別の go- でファイルに書き込む単純な Web クローラーを作成しました。ルーティーン。ただし、このプロセスを約 300,000 回繰り返した後、次のエラーが発生します。
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x22e9]</pre>
エラー「stacktrace」は非常に長く、残念ながら今はありません(実験を繰り返した後、後で投稿します)。
どういうわけかメモリを管理したり、チャネルを閉じたりする必要はありますか?
以下、一部省略したコードです。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"strconv"
)
func main() {
channel := make(chan []byte)
for i:=0; i < 20; i++ {
go fetcher(generateLink(), channel)
}
for a:=0; ; a++ {
go writeToFile(strconv.Itoa(a), <-channel)
go fetcher(generateLink(), channel)
fmt.Println(strconv.Itoa(a))
}
}
func fetcher(url string, channel chan []byte) {
resp, err := http.Get(url)
if err != nil {
channel <- []byte("")
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
channel <- body
}
func writeToFile(filename string, bytes []byte) {
ioutil.WriteFile(filename+".html", bytes, 0644)
}
func generateLink() string {
...
}