Traditionell umfasste der Vergleich zweier Nicht-Null-Funktionszeiger in Go die Verwendung von ==- oder !=-Operatoren. Nach jüngsten Änderungen führt dieser Ansatz jedoch nun zu Fehlern.
Die Abschaffung des Zeigergleichheitsvergleichs für Funktionen ergibt sich aus dem Konzept von Gleichheit vs. Identität. In Go bewerten die Operatoren == und != die Äquivalenz von Werten, nicht die Identität. Diese Unterscheidung soll Verwechslungen zwischen diesen Konzepten verhindern.
Darüber hinaus wirken sich Vergleiche von Funktionen auf die Leistung aus. Beispielsweise sollten anonyme Abschlüsse, die sich nicht auf externe Variablen beziehen, vom Compiler in einer einzigen Implementierung optimiert werden. Der Vergleich von Funktionszeigern würde diese Optimierung behindern und die dynamische Erstellung neuer Abschlüsse zur Laufzeit erfordern.
Obwohl es möglich ist, die Funktionsidentität mithilfe des Reflect-Pakets zu bestimmen, ist es wichtig, dies zu beachten Dieser Ansatz bringt undefiniertes Verhalten mit sich. Die Ergebnisse solcher Vergleiche sind unzuverlässig, da der Compiler möglicherweise beschließt, mehrere Funktionen in einer einzigen Implementierung zusammenzufassen.
Um Funktionszeiger effektiv zu vergleichen, kann der folgende Ansatz verwendet werden:
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Assign a unique variable to F1 var F2_ID = F2 // Assign a unique variable to F2 func main() { f1 := &F1_ID // Take the address of F1_ID f2 := &F2_ID // Take the address of F2_ID // Compare pointers fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
Durch die Verwendung von Zeigern auf eindeutige Variablen, die jeder Funktion zugeordnet sind, können Sie Zeigergleichheit zwischen Funktionen effektiv erkennen.
Das obige ist der detaillierte Inhalt vonWie kann ich Funktionszeiger in Go zuverlässig auf Gleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!