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
Patricia Arquetteoriginal
2024-12-26 05:06:10851parcourir

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

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()

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!

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