UPD:事实证明,这是有关Go中错误处理的问题我编写了一个简单的网络抓取工具,该工具在“主线程”上生成网页的地址,在一个go例程中获取实际的页面,然后通过传回内容chan,然后将其写入另一个文件中。常规。但是,在此过程进行了约300,000次迭代后,出现以下错误:panic: runtime error: invalid memory address or nil pointer dereference[signal 0xb code=0x1 addr=0x38 pc=0x22e9]</pre>错误“ stacktrace”很长,很遗憾,我现在没有它(我将在重复实验后稍后再发布)。是否需要以某种方式管理内存,关闭通道或类似的东西?以下是一些遗漏的代码。package mainimport ( "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 { ...}
3 回答
郎朗坤
TA贡献1921条经验 获得超9个赞
panic: runtime error: invalid memory address or nil pointer deference
这意味着您尝试使用nil指针。这是程序员错误,而不是内存不足错误。由于我无权访问实际的跟踪或代码,因此无法为您提供进一步的帮助。
编辑:再看一下您的代码后,我认为我找到了可能的错误来源。
resp, err := http.Get(url)
if err != nil {
channel <- []byte("")
}
defer resp.Body.Close()
您最终resp为了获得字段而进行引用,Body即使是err != nil。如果为err !=nil,则很有可能为零。
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
在某些时候,您对的调用http.Get()
失败并返回non-nil err
。发生这种情况时,您将一个空字节片放入通道中,但是继续进行,无论resp.Body
何时resp
为nil都尝试从中读取。
慕田峪4524236
TA贡献1875条经验 获得超5个赞
我只是在这里猜测,因为我没有stacktrace。但是以下两行对我来说可疑:
body, err := ioutil.ReadAll(resp.Body) channel <- body
当您在频道上发送身体时,您怎么知道它不是零?由于writeToFile不会对其进行检查,因此很有可能您正在向该文件写入一个nil字节片,并且该文件正在此处爆炸。如果捕获到错误,则应在继续操作之前进行检查。
- 3 回答
- 0 关注
- 224 浏览
添加回答
举报
0/150
提交
取消