Maison > Article > développement back-end > Comment comparer les fonctions dans Go ?
Dans Go, les fonctions sont des valeurs de première classe, ce qui signifie qu'elles peuvent être affectées à des variables et transmises comme arguments à d'autres fonctions. Cependant, contrairement aux autres types de Go, les fonctions ne sont pas comparables par défaut. Cela peut prêter à confusion lorsque vous tentez de comparer des fonctions dans votre code.
Comme détaillé dans les spécifications du langage Go, les valeurs des fonctions ne sont pas comparables. Tenter de comparer les valeurs de fonction à l'aide d'opérateurs de comparaison standard tels que == ou != entraînera une erreur du compilateur.
<code class="go">if handler.Post != Undefined { // ... }</code>
La fonction non définie présente dans l'exemple de code est un exemple de fonction qui n'est pas définie de la même manière que les fonctions normales. Il est déclaré comme une fonction qui prend un seul argument de chaîne et ne renvoie rien (func Undefined(foo string)). Undefined est ensuite affecté au champ Get de la structure Handler dans la fonction init. Cette affectation crée une valeur de fonction pour Undefined qui est stockée dans le champ Get.
Bien que les fonctions elles-mêmes ne puissent pas être comparées, il est possible de comparer les adresses des valeurs de fonction. Ceci peut être réalisé en utilisant la fonction fmt.Sprintf pour obtenir la représentation sous forme de chaîne de l'adresse de la fonction, puis en comparant les chaînes résultantes.
<code class="go">p1 := fmt.Sprintf("%v", Undefined) p2 := fmt.Sprintf("%v", hand.Get) fmt.Println("Expecting true:", p1 == p2)</code>
Cette méthode convertit efficacement les valeurs de la fonction en chaînes, qui peuvent ensuite être comparé à l'aide de l'opérateur ==.
Une approche alternative pour comparer les adresses de valeur de fonction consiste à utiliser la méthode réflexion.Value.Pointer() . Cette méthode renvoie l'adresse mémoire de la valeur réfléchie, qui peut ensuite être comparée à l'adresse d'une autre valeur de fonction.
<code class="go">u1 := reflect.ValueOf(Undefined).Pointer() u2 := reflect.ValueOf(hand.Get).Pointer() fmt.Println("Expecting true:", u1 == u2)</code>
Il n'est généralement pas recommandé de comparer la fonction adresses de valeur. Au lieu de cela, refactoriser votre code pour éliminer le besoin de telles comparaisons est une approche plus efficace et plus facile à maintenir. Envisagez d'utiliser une approche différente, telle que la définition d'une interface ou l'utilisation d'une assertion de type, pour obtenir le comportement souhaité.
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!