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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3