Funktionszeigergleichheit in Go
In Go ist der Vergleich von Funktionszeigern auf Gleichheit mit den Operatoren == oder != für Funktionen nicht zulässig sind nicht gleich Null. Dieses Verhalten verhindert die Vermischung von Gleichheits- und Identitätsvergleichen.
Funktionsgleichheit unterscheidet sich von Funktionsidentität. Identitätsvergleiche sollten verwendet werden, um festzustellen, ob zwei Funktionen dieselbe Funktion sind, während Gleichheitsvergleiche verwendet werden sollten, um festzustellen, ob zwei Funktionen äquivalent sind.
Verwenden des Reflect-Pakets zum Vergleichen der Funktionsidentität, wie im Atom-Beispiel gezeigt gilt als undefiniertes Verhalten. Der Compiler optimiert möglicherweise Funktionen, indem er ihre Implementierungen zusammenführt, wodurch der Vergleich unzuverlässig wird.
Um Funktionszeiger korrekt auf Identität zu vergleichen, können Sie für jede Funktion eindeutige Variablen erstellen und dann die Adressen dieser Variablen vergleichen. Dieser Ansatz stellt sicher, dass Sie Funktionszeiger für dieselbe Funktion vergleichen, unabhängig von Optimierungen.
Hier ist ein Beispiel für den Vergleich von Funktionszeigern auf Identität:
package main import "fmt" func F1() {} func F2() {} var F1_ID = F1 // Create a *unique* variable for F1 var F2_ID = F2 // Create a *unique* variable for 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 }
Das obige ist der detaillierte Inhalt vonWie kann ich Funktionszeiger für Identität in Go sicher vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!