Dans Go, la comparaison de deux pointeurs de fonction non nuls pour l'égalité à l'aide de l'opérateur d'égalité de pointeur standard == est devenue invalide dans les versions récentes. Il s'agit d'un écart par rapport au comportement pré-Go1 où les pointeurs de fonction pouvaient être comparés pour l'identité.
L'interdiction de comparer les pointeurs de fonction pour l'égalité a été motivée par les raisons suivantes :
Bien que la comparaison directe des fonctions par les pointeurs ne soit plus autorisée, il existe des approches alternatives pour obtenir le comportement souhaité :
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 }
Remarque : L'utilisation de Reflect repose sur un comportement non défini. Cela ne garantit pas la cohérence entre les plateformes ou les versions Go.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!