Heim >Backend-Entwicklung >Golang >Warum schlagen Verkettungsmethodenaufrufe mit Zeigerempfängern in Go fehl?
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 :
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!