Im Bereich der Programmierung stellt die Tour of Go-Übung 51 ein faszinierendes Rätsel dar. Die Scale-Methode, die angeblich unwirksam ist, wenn sie einen Vertex-Wert anstelle eines Zeigers empfängt, widerspricht dieser Vorstellung in der Praxis.
Zur Verdeutlichung: Der Originalcode deklariert v, eine Variable vom Typ Vertex, die an Scale als &v übergeben wird . Überraschenderweise hat das direkte Ersetzen von &v durch v immer noch einen beobachtbaren Effekt auf die Ausgabe.
Bei der Untersuchung der Mechanismen hinter diesem Phänomen stellen wir fest, dass das starke Typisierungssystem von Go die Deklaration klarer Variablentypen erzwingt. Wenn eine Funktion oder Methode einen Zeiger auf einen bestimmten Typ erfordert, z. B. T, können nur Variablen dieses genauen Typs (T) diese Anforderung erfüllen.
Der Compiler von Go verfügt jedoch über eine verborgene Funktion Leistung: Unter bestimmten Bedingungen transformiert es den Code für Sie. Eine solche Bedingung tritt auf, wenn eine Nicht-Zeigervariable (x) verwendet wird, um eine Methode (m) aufzurufen, die einen Zeigerempfänger akzeptiert. Hier greift der Compiler ein und führt effektiv die Anweisung (&x).m() anstelle von x.m() aus. Dieses faszinierende Verhalten steht im Einklang mit der Dokumentation von Go, in der es heißt:
„Ein Methodenaufruf x.m() ist gültig, wenn der Methodensatz von (der Typ von) x m enthält und die Argumentliste der Parameterliste zugewiesen werden kann.“ von m. Wenn x adressierbar ist und der Methodensatz von &x m enthält, ist x.m() die Abkürzung für (&x).m():"
Das Verständnis dieses Konzepts verdeutlicht die merkwürdige Beobachtung, dass Scale ändert den Empfänger auch dann, wenn ihm ein Nicht-Zeiger-Argument bereitgestellt wird: Die stille Transformation des Compilers stellt sicher, dass das beabsichtigte Verhalten wirksam wird.
Das obige ist der detaillierte Inhalt vonWarum scheint der Compiler von Go beim Aufrufen von Methoden implizit Zeiger zu übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!