UPD:事实证明,这是有关Go中错误处理的问题
我编写了一个简单的Web搜寻器,它在“主线程”上生成网页的地址,在一个go例程中获取实际页面,并通过chan
给出内容,然后在另一个go中将其写入文件-常规。但是,经过大约30万次此过程的迭代,我得到以下错误:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x22e9]</pre>
错误“stacktrace”很长,很遗憾,我现在没有这个错误(我将在重复实验后稍后再发布)。
是否需要以某种方式管理内存,关闭 channel 或类似的东西?
以下是一些省略的代码。
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 {
...
}
最佳答案
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
,则很有可能是nil。