Heim >Backend-Entwicklung >Golang >Warum erhalte ich in meinem Go-Code den Fehler „Panik: Laufzeitfehler: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung'?

Warum erhalte ich in meinem Go-Code den Fehler „Panik: Laufzeitfehler: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung'?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-26 05:06:10805Durchsuche

Why am I getting a

Go: Panik: Laufzeitfehler: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung

Problem

Beim Aufruf von Go kommt es explizit zu einer Panik mit der folgenden Meldung :

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

Antwort

Die Panik: Laufzeitfehler: Ungültige Speicheradresse oder Nullzeiger-Dereferenzierung tritt auf, wenn einer Ressource eine Speicheradresse fehlt, was als Nullzeiger-Dereferenzierung bezeichnet wird. Dies geschieht normalerweise, wenn Sie versuchen, einen Zeiger zu verwenden, der auf nichts zeigt, oder wenn Sie auf ein Feld mit einem Nullzeiger zugreifen.

So beheben Sie dieses Problem:

  1. Überprüfen Sie, ob Null vorhanden ist Zeiger: Stellen Sie sicher, dass Sie nil keine Variablen oder Strukturfelder zugewiesen haben Werte.
  2. Speicheradressen validieren: Stellen Sie sicher, dass Sie nicht versuchen, auf eine Speicheradresse zuzugreifen, die nicht existiert. Verwenden Sie den &-Operator, um die Adresse einer Variablen oder eines Strukturfelds abzurufen.
  3. Debuggen Sie den Code: Verwenden Sie einen Debugger wie delve oder das integrierte Debugpaket, um Ihren Code schrittweise durchzugehen und zu identifizieren Welche Zeile verursacht die Panik? Der in der Fehlermeldung bereitgestellte Stack-Trace kann dabei helfen, den problematischen Code zu lokalisieren.
  4. Untersuchen Sie den Stack-Trace: Der Stack-Trace liefert wertvolle Informationen über die Funktionsaufrufe, die zur Panik geführt haben kann dabei helfen, die Ursache des Problems zu identifizieren.

Im angegebenen Code trat die Panik in der getBody-Funktion auf, als versucht wurde, die zu schließen res.Körper. Gemäß den Dokumenten für func (*Client) Do wird ein Fehler nur zurückgegeben, wenn er durch eine Client-Richtlinie oder einen HTTP-Protokollfehler verursacht wird, und erfolgreiche Antworten enthalten immer einen Körper ungleich Null.

Die vorgeschlagene Änderung ist :

res, err := client.Do(req)

if err != nil {
    return nil, err
}
defer res.Body.Close()

Indem Sie vor der Verwendung von res.Body nach dem Fehler suchen, können Sie alle Fehler, die während der Anfrage aufgetreten sein könnten, ordnungsgemäß behandeln und vermeiden Panik.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich in meinem Go-Code den Fehler „Panik: Laufzeitfehler: ungültige Speicheradresse oder Null-Zeiger-Dereferenzierung'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn