Heim >Backend-Entwicklung >Golang >Warum scheint die Methode von Go mit einem Zeigerempfänger Nicht-Zeigerwerte zu ändern?

Warum scheint die Methode von Go mit einem Zeigerempfänger Nicht-Zeigerwerte zu ändern?

Susan Sarandon
Susan SarandonOriginal
2024-12-05 17:26:11328Durchsuche

Why Does Go's Method with a Pointer Receiver Seem to Modify Non-Pointer Values?

Methode mit Zeigerempfänger

In der Tour of Go untersucht Übung 51 Methodenempfänger. Die bereitgestellte Erklärung besagt, dass die Scale-Methode, die einen Zeiger auf einen Vertex bearbeitet, keine Auswirkung hat, wenn sie einen Vertex-Wert direkt empfängt. Die Änderung der Hauptfunktion zur Übergabe eines Nicht-Zeiger-Vertex widerspricht jedoch dieser Behauptung.

Warum die Diskrepanz?

Obwohl der Code einen Nicht-Zeiger-Wert empfängt, Scale Ändert die Variable erfolgreich. Dieses Verhalten kann auf das starke Tippsystem von Go zurückgeführt werden. Wenn in einem bestimmten Kontext ein Zeiger auf T erwartet wird, kann nur ein Zeiger auf T (*T) diese Anforderung erfüllen.

Der Compiler verwendet eine Transformation hinter den Kulissen, um dieses Verhalten zu ermöglichen:

"Ein Methodenaufruf x.m() ist gültig, wenn der Methodensatz von (dem Typ von) x m enthält und die Argumentliste der Parameterliste von m zugewiesen werden kann. Wenn x adressierbar ist und der Methodensatz von &x enthält m, x.m() ist eine Abkürzung für (&x).m():"

Im Wesentlichen schreibt der Compiler den Code neu, um einen Zeiger auf den Nicht-Zeigerwert zu übergeben, wenn die empfangende Variable einen Zeigerempfänger hat Typ. Dadurch kann die Scale-Methode die ursprüngliche Variable ändern.

Das obige ist der detaillierte Inhalt vonWarum scheint die Methode von Go mit einem Zeigerempfänger Nicht-Zeigerwerte zu ändern?. 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