Heim > Backend-Entwicklung > Golang > Golang-Fehler: „Ungültiger Zeigerempfänger …' Wie kann ich ihn lösen?

Golang-Fehler: „Ungültiger Zeigerempfänger …' Wie kann ich ihn lösen?

PHPz
Freigeben: 2023-06-25 10:33:05
Original
944 Leute haben es durchsucht

Bei der Entwicklung von Projekten mit Golang kann es gelegentlich zu unerwarteten Fehlern kommen. Einer davon ist der Fehler „Ungültiger Zeigerempfänger …“, der normalerweise die Struktur im Code zerstört und zum Absturz des Programms führt. In diesem Artikel werde ich die Ursache dieses Fehlers erläutern und einige mögliche Lösungen anbieten.

1. Fehlerursache

Zeiger in Golang sind sehr leistungsfähig, müssen aber mit großer Vorsicht verwendet werden. Wenn in einer Methode ein Zeigerempfänger definiert ist und beim Aufruf der Methode ein Nicht-Zeigerwert übergeben wird, tritt der Fehler „Ungültiger Zeigerempfänger …“ auf. Zum Beispiel:

type Book struct {
  Name     string
  Author   string
  Pages    int
  Progress float64
}

func (b *Book) Read(pageCount int) {
  b.Progress = float64(pageCount)/float64(b.Pages) * 100
}

func main() {
  myBook := Book{
    Name:     "Golang book",
    Author:   "John Doe",
    Pages:    200,
    Progress: 0,
  }

  myBook.Read(50) // invalid pointer receiver Book literal
}
Nach dem Login kopieren

In diesem Beispiel ist die Read-Methode als Zeigerempfänger definiert, was bedeutet, dass sie einen Zeiger auf ein Buch benötigt, um zu funktionieren. Allerdings übergeben wir beim Aufruf der Read-Methode nur ein Book-Literal, daher der Fehler „Ungültiges Zeigerempfänger-Book-Literal“.

2. Lösung

Um den Fehler zu beheben, müssen wir sicherstellen, dass der Zeigerwert beim Aufruf der Read-Methode übergeben wird. Es gibt mehrere Möglichkeiten, dies zu erreichen.

2.1 Strukturvariablenadresse an Methode übergeben

Dies ist die häufigste Lösung. Übergeben Sie ihm beim Aufruf der Methode einfach die Adresse der Strukturvariablen. Zum Beispiel:

myBook := &Book{
  Name:     "Golang book",
  Author:   "John Doe",
  Pages:    200,
  Progress: 0,
}

myBook.Read(50) // no error
Nach dem Login kopieren

In diesem Beispiel müssen wir nur das „&“-Symbol vor der Strukturvariablen hinzufügen, um ihre Adresse zu erhalten. Diese Adresse kann an die Read-Methode übergeben werden, da die Methode einen Zeiger auf das Buch erfordert.

2.2 Methodenempfänger ändern

Wenn wir wirklich den Literalwert der Struktur an die Methode übergeben möchten, können wir versuchen, den Zeigerempfänger in der Methodendefinition in einen Nicht-Zeigerempfänger zu ändern. Zum Beispiel:

func (b Book) Read(pageCount int) {
  b.Progress = float64(pageCount)/float64(b.Pages) * 100
}

func main() {
  myBook := Book{
    Name:     "Golang book",
    Author:   "John Doe",
    Pages:    200,
    Progress: 0,
  }

  myBook.Read(50) // no error
}
Nach dem Login kopieren

In diesem Beispiel haben wir den Empfänger der Read-Methode von „*Book“ in „Book“ geändert, was bedeutet, dass ein Book-Wert anstelle eines Zeigers erwartet wird. Jetzt können wir ihm ohne Fehler ein Book-Literal übergeben.

3. Zusammenfassung

Der Fehler „Ungültiger Zeigerempfänger…“ wird normalerweise durch eine falsche Angabe des Zeigerempfängers verursacht. Beim Schreiben eines Programms sollten wir sorgfältig mit Zeigern umgehen, um die Korrektheit und Zuverlässigkeit des Codes sicherzustellen. In diesem Artikel untersuchen wir zwei mögliche Lösungen: die Übergabe der Adresse und die Änderung des Empfängertyps. Ich hoffe, dieser Artikel hilft Ihnen, ähnliche Fehler zu beheben.

Das obige ist der detaillierte Inhalt vonGolang-Fehler: „Ungültiger Zeigerempfänger …' Wie kann ich ihn lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage