UPD:原来,这是一个关于 Go 中的错误处理的问题
我编写了一个简单的网络爬虫,它在“主线程”上生成网页的地址,在一个 go-routine 中获取实际页面并通过 a 返回内容chan
,并将其写入另一个 go-常规。但是,经过大约 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 {
...
}