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

问题描述 投票:-5回答:1

当我从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

http pointers go scope
1个回答
3
投票

这似乎很可能是因为resResponseResponse.BodyReadCloser,只能消耗一次。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.