运行时错误:无效的内存地址或nil指针取消引用

我是新手,尝试制作一个简单的网络爬虫。我不断收到“紧急情况:运行时错误:无效的内存地址或nil指针取消引用”,并且不知道如何解决该问题。我有一个“

advancedFetcher”功能和一个“basicFetcher”功能,在任何一个下都出现相同的错误。这个答案建议检查每个错误(我认为是错误),但仍然出现错误。谢谢!

package main

import (

"crypto/tls"

"fmt"

"io/ioutil"

"net"

"net/http"

"time"

)

var tr = &http.Transport{

TLSClientConfig: &tls.Config{InsecureSkipVerify: true},

MaxIdleConnsPerHost: 25,

DisableKeepAlives: true,

Proxy: http.ProxyFromEnvironment,

Dial: (&net.Dialer{

Timeout: 10 * time.Second,

KeepAlive: 10 * time.Second,

}).Dial,

TLSHandshakeTimeout: 5 * time.Second,

}

var client = &http.Client{Transport: tr}

func makeGetRequest(uri string) *http.Response {

req, err := http.NewRequest("GET", uri, nil)

if err != nil {

fmt.Println(err)

}

req.Header.Add("User-Agent", "Hi it's me again")

resp, err := client.Do(req)

if err != nil {

fmt.Println(err)

}

return resp

}

func advancedFetcher(uri string, c chan int) {

fmt.Println("Getting: ", uri)

resp := makeGetRequest(uri)

defer resp.Body.Close()

c <- resp.StatusCode

}

func basicFetcher(uri string, c chan int) {

fmt.Println("Getting: ", uri)

resp, err := http.Get(uri)

if err != nil {

fmt.Println(err)

}

defer resp.Body.Close()

_, err = ioutil.ReadAll(resp.Body)

c <- resp.StatusCode

}

func main() {

c := make(chan int)

rows := []string{"https://www.google.com", "http://www.fdicconnect.gov"}

for _, row := range rows {

//go basicFetcher(row, c)

go advancedFetcher(row, c)

}

for _ = range rows {

select {

case result := <-c:

fmt.Println(result)

}

}

fmt.Println("All Done")

}

编辑#1:

Getting:  https://www.google.com

Getting: http://www.fdicconnect.gov

200

Get http://www.fdicconnect.gov: dial tcp 167.176.6.86:80: i/o timeout

panic: runtime error: invalid memory address or nil pointer dereference

[signal 0xb code=0x1 addr=0x0 pc=0x400ff2]

goroutine 21 [running]:

runtime.panic(0x6594c0, 0x7e9b53)

/usr/local/go/src/pkg/runtime/panic.c:279 +0xf5

main.advancedFetcher(0x6c3b70, 0x1a, 0xc208004180)

/home/me/go/src/testfolder/tester/main.go:41 +0x1c2

created by main.main

/home/me/go/src/testfolder/tester/main.go:61 +0x123

goroutine 16 [chan receive]:

main.main()

/home/me/go/src/testfolder/tester/main.go:65 +0x198

goroutine 19 [finalizer wait]:

runtime.park(0x413bd0, 0x7ee660, 0x7ec8c9)

/usr/local/go/src/pkg/runtime/proc.c:1369 +0x89

runtime.parkunlock(0x7ee660, 0x7ec8c9)

/usr/local/go/src/pkg/runtime/proc.c:1385 +0x3b

runfinq()

/usr/local/go/src/pkg/runtime/mgc0.c:2644 +0xcf

runtime.goexit()

/usr/local/go/src/pkg/runtime/proc.c:1445

goroutine 17 [syscall]:

runtime.goexit()

/usr/local/go/src/pkg/runtime/proc.c:1445

回答:

您的程序在惊慌之前打印错误吗?如果没有记错,如果http.Get返回错误,那么resp.Body ==nil,这将导致你的错误,因为你不能叫resp.Body.Close()nil

正如twotwotwo建议的那样,您应该编写函数,以便它返回一个(结果,错误)对,以便您可以在遇到问题之前正常地终止它。

以上是 运行时错误:无效的内存地址或nil指针取消引用 的全部内容, 来源链接: utcz.com/qa/426273.html

回到顶部