当我从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的相关答案。
答案 0 :(得分:3)
似乎很可能是因为res
是Response
而Response.Body
是ReadCloser
,只能使用一次。
如果要重新使用正文,请使用ioutil.ReadAll
将其读入缓冲区(如[] byte或string)。如果您想要来自res
的额外数据,请使用结构来包装它。
如果您的用例使用不同的响应(这对我更有意义),请将http.Get
移动到循环中。 (警告:获取网址1e5次可能会造成麻烦)。