Maison >développement back-end >Golang >Comment résoudre les erreurs « Adresse mémoire invalide ou déréférencement de pointeur nul » dans les robots d'exploration Web Go ?

Comment résoudre les erreurs « Adresse mémoire invalide ou déréférencement de pointeur nul » dans les robots d'exploration Web Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-04 18:25:161012parcourir

How to Troubleshoot

Adresse mémoire non valide ou erreur de déréférencement de pointeur nul : dépannage des robots d'exploration Web dans Go

Lorsque vous rencontrez l'"erreur d'exécution : adresse mémoire non valide ou nil pointer déréférencement" dans Go, il est important de déterminer où se situe le problème. Examinons un scénario courant auquel sont confrontés les novices en matière d'exploration de sites Web.

Le code fourni utilise deux fonctions pour l'exploration de sites Web, advancedFetcher et basicFetcher. Les deux fonctions effectuent des requêtes HTTP à l'aide de l'utilitaire makeGetRequest. Cependant, ils peuvent déclencher l'erreur susmentionnée dans certaines circonstances.

Comprendre le problème

Les experts suggèrent de vérifier avec diligence les erreurs dans tout le code. Après avoir mis en œuvre cette pratique, vous risquez toujours de rencontrer la même erreur. Examinons ce qui se passe de plus près.

Dans la fonction basicFetcher, ioutil.ReadAll(resp.Body) est invoqué une fois la requête effectuée. Si la requête échoue (c'est-à-dire err != nil), le corps est toujours lu, ce qui peut conduire à l'erreur en question car resp.Body pourrait être nul dans cette situation.

Résoudre le problème

Pour résoudre ce problème, pensez à modifier la fonction basicFetcher pour renvoyer un tuple (résultat, erreur). Cela permet une résiliation gracieuse en cas d’erreur. Voici un exemple de révision :

func basicFetcher(uri string, c chan int) (int, error) {
    fmt.Println("Getting: ", uri)
    resp, err := http.Get(uri)
    if err != nil {
        return 0, err
    }
    defer resp.Body.Close()
    _, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        return 0, err
    }
    return resp.StatusCode, nil
}

Conseils supplémentaires

  • Vérifiez les erreurs : Vérifiez soigneusement les erreurs à chaque étape, en particulier lors de la récupération et de la lecture des réponses.
  • Utilisez Idiomatic Go : Utiliser des pratiques Go idiomatiques, telles que le renvoi de tuples d'erreur pour gérer les erreurs potentielles avec élégance.
  • Gérer les erreurs attendues : Anticiper et gérer les erreurs spécifiques qui peuvent survenir lors de l'exploration du Web, telles que les erreurs HTTP ou la connexion. délais d'attente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn