第一次循环迭代后无效的内存地址或nil指针取消引用

时间:2018-01-02 06:18:13

标签: http pointers go scope

当我从GetCompanyFilingListRes返回(地图切片)并打印输出时,我的代码可以正常运行一次。但是在第二次迭代中,我得到了panic: runtime error: invalid memory address or nil pointer dereference

package main

import (
    "data/edgar"
    "fmt"
    "net/http"
)

func main() {
    url := "calltomylocalserver.com/page.html"
    res, _ := http.Get(url)
    for i := 0; i < 100000; i++ {
        // GetCompanyFilingListRes comsumes res.Body 
        // before returning a slice of maps
        m := edgar.GetCompanyFilingListRes(res)
        fmt.Println(m)
    }
}

我确信这很简单,但是我不知道为什么res在第一次迭代后似乎无法访问。 GC是否将其从内存中删除?我怎么能阻止这种情况发生?感谢。

编辑:

我认为我对这个问题的错误并不包括GetCompanyFilingListRes消耗res.Body的事实。而leaf bebop mentioned只能消耗一次。

我找到here的相关答案。

1 个答案:

答案 0 :(得分:3)

似乎很可能是因为resResponseResponse.BodyReadCloser,只能使用一次。

如果要重新使用正文,请使用ioutil.ReadAll将其读入缓冲区(如[] byte或string)。如果您想要来自res的额外数据,请使用结构来包装它。

如果您的用例使用不同的响应(这对我更有意义),请将http.Get移动到循环中。 (警告:获取网址1e5次可能会造成麻烦)。