Égalité des pointeurs de fonction dans Go
Dans Go, la comparaison des pointeurs de fonction pour l'égalité à l'aide des opérateurs == ou != n'est pas autorisée pour les fonctions qui ne sont pas nuls. Ce comportement empêche le mélange des comparaisons d'égalité et d'identité.
L'égalité des fonctions diffère de l'identité des fonctions. Les comparaisons d'identité doivent être utilisées pour déterminer si deux fonctions sont la même fonction, tandis que les comparaisons d'égalité doivent être utilisées pour déterminer si deux fonctions sont équivalentes.
Utiliser le package Reflect pour comparer l'identité de la fonction, comme indiqué dans l'exemple Atom , est considéré comme un comportement indéfini. Le compilateur peut optimiser les fonctions en fusionnant leurs implémentations, ce qui rend la comparaison peu fiable.
Pour comparer correctement les pointeurs de fonction pour l'identité, vous pouvez créer des variables uniques pour chaque fonction, puis comparer les adresses de ces variables. Cette approche garantit que vous comparez les pointeurs de fonction pour la même fonction, quelles que soient les optimisations.
Voici un exemple de comparaison des pointeurs de fonction pour l'identité :
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 }
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!