Heim >Backend-Entwicklung >Golang >Warum schlagen Verkettungsmethodenaufrufe mit Zeigerempfängern in Go fehl?

Warum schlagen Verkettungsmethodenaufrufe mit Zeigerempfängern in Go fehl?

Susan Sarandon
Susan SarandonOriginal
2024-11-29 13:03:10577Durchsuche

Why Does Chaining Method Calls Fail with Pointer Receivers in Go?

Verstehen: „Die Adresse von kann nicht übernommen werden“ und „Zeigermethode kann nicht aufgerufen werden“ in Go

Trotz der ähnlichen Funktionalität Von den Codeausschnitten kompiliert und funktioniert einer, während der andere Fehler generiert:

// This compiles and works
diff := projected.Minus(c.Origin)
dir := diff.Normalize()

// This does not (yields the errors in the title)
dir := projected.Minus(c.Origin).Normalize()

Die Ungleichheit ist Dies ist auf den Unterschied in den Empfängertypen für die Normalize()-Methode zurückzuführen.

Empfängertypen in Go-Methoden

Go-Methoden können entweder einen Wertempfänger oder einen Zeigerempfänger haben. Ein Wertempfänger arbeitet mit einer Kopie der Struktur, während ein Zeigerempfänger mit der ursprünglichen Struktur selbst arbeitet.

Im Fall von Normalize() verfügt es über einen Zeigerempfänger, der einen Zeiger auf einen Vector3-Wert als benötigt Empfänger.

Variablen und Rückgabewerte adressieren

Variablen in Go sind adressierbar, also die Adresse einer Variablen kann als Argument an eine Zeigerempfängermethode übergeben werden. Allerdings sind die Rückgabewerte von Funktions- und Methodenaufrufen nicht adressierbar.

Kettenaufrufe mit Zeigerempfängern

In dem Beispiel, in dem er kompiliert, übernimmt der Compiler automatisch die Adresse der Diff-Variablen, damit sie mit dem Zeigerempfänger von Normalize() übereinstimmt.

In dem Beispiel, in dem nicht kompiliert wird, kann der Compiler die Adresse der Rückgabe nicht automatisch übernehmen Wert von Minus(), da es nicht adressierbar ist. Da der Rückgabewert eine Kopie ist, muss er zuerst einer Variablen zugewiesen werden, damit ihre Adresse übernommen werden kann.

Problemumgehungen

Es gibt mehrere Problemumgehungen, um das Problem zu beheben :

  • Wertempfänger: Ändern Sie Normalize(), um einen Wertempfänger zu haben, wodurch die Notwendigkeit entfällt um die Adresse der Rückgabewerte zu übernehmen.
  • Zeiger-Rückgabewerte: Ändern Sie Minus(), um einen Zeiger auf Vector3 zurückzugeben.
  • Hilfsfunktion: Erstellen Sie eine Hilfsfunktion, die die Adresse eines Werts zurückgibt und so die gewünschte Verkettung ermöglicht Aufrufe.

Konsistenz der Empfänger- und Ergebnistypen

Es ist ratsam, die Konsistenz der Empfänger- und Ergebnistypen in einem benutzerdefinierten Typ aufrechtzuerhalten. Wenn die meisten Methoden Zeigerempfänger haben, sollten alle Methoden Zeigerempfänger verwenden. Wenn die meisten Methoden Zeiger zurückgeben, sollten auch alle Methoden Zeiger zurückgeben.

Das obige ist der detaillierte Inhalt vonWarum schlagen Verkettungsmethodenaufrufe mit Zeigerempfängern in Go fehl?. 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