Comparaison de fonctions dans Go
Dans Go, comparer deux valeurs de fonction à l'aide d'opérateurs de comparaison standard n'est pas réalisable. Cependant, il existe des méthodes alternatives pour vérifier si les fonctions sont équivalentes.
Utilisation des adresses de fonction
Les valeurs des fonctions elles-mêmes ne sont pas comparables. Au lieu de cela, vous pouvez comparer les adresses des valeurs de fonction pour déterminer si elles font référence à la même fonction. Pour obtenir l'adresse de la fonction, vous pouvez utiliser la fonction Sprintf("%v") du package fmt :
<code class="go">hand := &Handler{Undefined, Defined} p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) if p1 == p2 { // Undefined and hand.Get refer to the same function. }</code>
Utiliser Reflect.Value
Une autre approche consiste à utilisez le type reflex.Value pour obtenir le pointeur de fonction sous-jacent. C'est précisément ce que fait le package fmt en interne :
<code class="go">value := reflect.ValueOf(Undefined) ptr := value.Pointer()</code>
Vous pouvez ensuite comparer les valeurs ptr pour déterminer si les fonctions sont égales.
Attention
Cependant, il est important de noter que la comparaison des adresses de fonctions n'est pas une méthode fiable pour tous les scénarios. Les fermetures de fonctions et les fonctions générées dynamiquement peuvent avoir des adresses différentes même si elles effectuent la même tâche.
Par conséquent, il est généralement recommandé d'éviter de comparer les adresses de fonctions et d'envisager plutôt des approches alternatives pour comparer le comportement des fonctions, telles que tester leur entrée et valeurs de sortie.
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!