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。

09-17 13:30
查看更多