In Go ist der Vergleich zweier Nicht-Null-Funktionszeiger auf Gleichheit mithilfe des Standardzeigergleichheitsoperators == in neueren Versionen ungültig geworden. Dies ist eine Abkehr vom Verhalten vor Go1, bei dem Funktionszeiger auf Identität verglichen werden konnten.
Das Verbot des Vergleichs von Funktionszeigern auf Gleichheit wurde motiviert durch Die folgenden Gründe:
Während ein direkter Zeigervergleich von Funktionen nicht mehr zulässig ist, gibt es alternative Ansätze, um das gewünschte Verhalten zu erreichen:
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 fmt.Println(f1 == f1) // Prints true fmt.Println(f1 == f2) // Prints false }
package main import "fmt" import "reflect" func SomeFun() {} func AnotherFun() {} func main() { sf1 := reflect.ValueOf(SomeFun) sf2 := reflect.ValueOf(SomeFun) fmt.Println(sf1.Pointer() == sf2.Pointer()) // Prints true af1 := reflect.ValueOf(AnotherFun) fmt.Println(sf1.Pointer() == af1.Pointer()) // Prints false }
Hinweis: Die Verwendung von „Reflect“ setzt undefiniertes Verhalten voraus. Es garantiert keine Konsistenz zwischen Plattformen oder Go-Versionen.
Das obige ist der detaillierte Inhalt vonWie kann ich Funktionszeiger in Go auf Gleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!