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
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 :
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!