Heim >Backend-Entwicklung >Golang >Warum kann ich keine Zeigermethode für das Ergebnis eines Go-Funktionsaufrufs aufrufen?

Warum kann ich keine Zeigermethode für das Ergebnis eines Go-Funktionsaufrufs aufrufen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-19 10:08:15997Durchsuche

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

Verstehen der Fehler „Adresse kann nicht übernommen werden“ und „Zeigermethode kann nicht aufgerufen werden“

Beim Arbeiten mit Go können Fehler auftreten B. „Die Adresse von kann nicht übernommen werden“ oder „Zeigermethode kann nicht aufgerufen werden“, verwirren diejenigen, die das lernen Sprache.

Das Problem:

Bedenken Sie den folgenden Go-Code:

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }

Die zweite Zeile verursacht Kompilierungsfehler, weil Vector3.Normalize() erfordert einen Zeigerempfänger, d. h. es erwartet einen Zeiger auf einen Vector3-Wert (*Vector3) anstelle eines Vector3 Wert.

Warum es passiert:

Rückgabewerte von Funktions- und Methodenaufrufen können in Go nicht adressiert werden. Daher kann der Compiler im zweiten Beispiel die Adresse des Ergebnisses von Vector3.Minus() nicht übernehmen, was verhindert, dass er Normalize() für diesen Wert aufruft.

Mögliche Lösungen:

  • Separate Zuweisung: Weisen Sie den Rückgabewert einer Variablen zu und rufen Sie die Methode für diese Variable auf, wie in der Abbildung gezeigt erstes Beispiel, bei dem dir = diff.Normalize() funktioniert.
  • Empfängertyp ändern: Ändern Sie die Normalize()-Methode so, dass sie einen Wertempfänger hat (Vector3 anstelle von *Vector3). Dies ermöglicht die Verkettung von Methodenaufrufen für Nicht-Zeigerwerte.
  • Rückgabezeiger: Sorgen Sie dafür, dass Normalize() einen Zeiger (*Vector3) zurückgibt, um zu vermeiden, dass der Rückgabewert adressiert werden muss.
  • Erstellen Sie eine Hilfsfunktion: Erstellen Sie eine Funktion, um die Adresse eines Werts zurückzugeben, z. B. pv(v), um &v zurückzugeben, und rufen Sie Normalize() für das Ergebnis auf.

Das obige ist der detaillierte Inhalt vonWarum kann ich keine Zeigermethode für das Ergebnis eines Go-Funktionsaufrufs aufrufen?. 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