Erreur d'exécution: adresse mémoire non valide ou nul déréférencement de pointeur

Je suis nouveau à l'aller et essayer de faire un simple webcrawler. Je reçois un mouvement de panique": erreur d'exécution: adresse mémoire non valide ou nul déréférencement de pointeur" et n'ont aucune idée de comment résoudre le problème. J'ai un "advancedFetcher de la fonction" et un "basicFetcher" fonction et j'obtiens la même erreur en vertu de l'un ou l'autre. Cette réponse suggère de vérifier chacun d'erreur (que j'ai je crois) mais j'ai toujours une erreur. Merci!

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")
}

EDIT #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
  • Est-ce votre programme de l'impression d'une erreur avant de paniquer? Si ma mémoire est bonne, si http.Get renvoie une erreur, resp.Body est nil qui serait la cause de votre erreur.
  • Tu veux dire quelque chose comme Edit #1? Si oui, je reçois toujours le même message d'erreur.
  • Ce que la ligne est en train de jeter la panique?
  • Ouais, inclure le vidage sur incident. Habituellement fait quelque chose comme cela beaucoup plus facile à déboguer.
  • J'ai ajouté le vidage sur incident. Ligne n ° 41 se réfère à "reporter resp.Corps.Close()" dans le "advancedFetcher" de la fonction.
  • Pourquoi le downvote? Un drive-by avec aucune explication n'aide pas n'importe qui.
  • Ressemble à ce que Jimmy l'a dit dans le premier commentaire est juste, alors: vous avez eu un i/o timeout de la lecture, de sorte resp.Body était nil, donc resp.Body.Close() a échoué. Les fonctions qui s'appuient sur les I/O doit souvent revenir (résultat, erreur) paires eux-mêmes pour gérer cela.
  • Formellement répondre et je vais accepter. Thx!
  • fait, merci!