Maison > développement back-end > Golang > Pourquoi est-ce que j'obtiens une erreur « panique : erreur d'exécution : adresse mémoire non valide ou déréférencement de pointeur nul » dans mon code Go ?

Pourquoi est-ce que j'obtiens une erreur « panique : erreur d'exécution : adresse mémoire non valide ou déréférencement de pointeur nul » dans mon code Go ?

Patricia Arquette
Libérer: 2024-12-26 05:06:10
original
834 Les gens l'ont consulté

Why am I getting a

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

Problème

Lors de l'appel de Go, il panique explicitement avec le message suivant :

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x38 pc=0x26df]

goroutine 1 [running]:
main.getBody(0x1cdcd4, 0xf800000004, 0x1f2b44, 0x23, 0xf84005c800, ...)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:65 +0x2bb
main.getToken(0xf84005c7e0, 0x10)
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:140 +0x156
main.main()
        /Users/matt/Dropbox/code/go/scripts/cron/fido.go:178 +0x61

goroutine 2 [syscall]:
created by runtime.main
        /usr/local/Cellar/go/1.0.3/src/pkg/runtime/proc.c:221

goroutine 3 [syscall]:
syscall.Syscall6()
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/asm_darwin_amd64.s:38 +0x5
syscall.kevent(0x6, 0x0, 0x0, 0xf840085188, 0xa, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/zsyscall_darwin_amd64.go:199 +0x88
syscall.Kevent(0xf800000006, 0x0, 0x0, 0xf840085188, 0xa0000000a, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/syscall/syscall_bsd.go:546 +0xa4
net.(*pollster).WaitFD(0xf840085180, 0xf840059040, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd_darwin.go:96 +0x185
net.(*pollServer).Run(0xf840059040, 0x0)
        /usr/local/Cellar/go/1.0.3/src/pkg/net/fd.go:236 +0xe4
created by net.newPollServer
        /usr/local/Cellar/go/1.0.3/src/pkg/net/newpollserver.go:35 +0x382
Copier après la connexion

Réponse

La panique : erreur d'exécution : Une adresse mémoire invalide ou un déréférencement de pointeur nul se produit lorsqu'une ressource n'a pas d'adresse mémoire, appelé déréférencement de pointeur nul. Cela se produit généralement lorsque vous essayez d'utiliser un pointeur qui ne pointe vers rien ou lorsque vous accédez à un champ d'un pointeur nul.

Pour résoudre ce problème :

  1. Vérifiez nil pointeurs : Assurez-vous de n'avoir attribué aucune variable ou champ de structure à des valeurs nulles.
  2. Validez la mémoire adresses : Assurez-vous que vous n'essayez pas d'accéder à une adresse mémoire qui n'existe pas. Utilisez l'opérateur & pour obtenir l'adresse d'un champ de variable ou de structure.
  3. Déboguer le code : Utilisez un débogueur comme Delve ou le package de débogage intégré pour parcourir votre code et identifier quelle ligne provoque la panique. La trace de pile fournie dans le message d'erreur peut aider à identifier le code problématique.
  4. Inspectez la trace de pile : La trace de pile fournit des informations précieuses sur les appels de fonction menant à la panique, qui peut aider à identifier la source du problème.

Dans le code donné, la panique s'est produite dans la fonction getBody lors de la tentative de fermeture du res.Body. Selon la documentation de func (*Client) Do, une erreur n'est renvoyée que si elle est causée par la politique du client ou une erreur de protocole HTTP, et les réponses réussies contiendront toujours un corps non nul.

La modification suggérée est :

res, err := client.Do(req)

if err != nil {
    return nil, err
}
defer res.Body.Close()
Copier après la connexion

En vérifiant l'erreur avant d'essayer d'utiliser res.Body, vous pouvez gérer gracieusement toutes les erreurs qui auraient pu se produire lors de la requête et éviter le panique.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal