Traditionnellement, comparer deux pointeurs de fonction non nuls dans Go impliquait l'utilisation d'opérateurs == ou !=. Cependant, suite à des changements récents, cette approche entraîne désormais des erreurs.
L'élimination de la comparaison d'égalité de pointeur pour les fonctions découle du concept d'égalité par rapport à l'identité. Dans Go, les opérateurs == et != évaluent l'équivalence des valeurs, pas l'identité. Cette distinction vise à éviter toute confusion entre ces concepts.
De plus, les comparaisons de fonctions ont un impact sur les performances. Par exemple, les fermetures anonymes qui ne font pas référence à des variables externes doivent être optimisées en une seule implémentation par le compilateur. La comparaison des pointeurs de fonction entraverait cette optimisation, nécessitant la création dynamique de nouvelles fermetures au moment de l'exécution.
Bien qu'il soit possible de déterminer l'identité d'une fonction à l'aide du package Reflect, il est important de noter que cette approche implique un comportement indéfini. Les résultats de telles comparaisons ne sont pas fiables, car le compilateur peut décider de regrouper plusieurs fonctions en une seule implémentation.
Pour comparer efficacement les pointeurs de fonction, l'approche suivante peut être utilisée :
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 }
En employant des pointeurs vers des variables uniques associées à chaque fonction, vous pouvez détecter efficacement l'égalité des pointeurs entre les fonctions.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3