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