"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je comparer de manière fiable les pointeurs de fonction pour l’égalité dans Go ?

Comment puis-je comparer de manière fiable les pointeurs de fonction pour l’égalité dans Go ?

Publié le 2024-12-22
Parcourir:614

How Can I Reliably Compare Function Pointers for Equality in Go?

Détection de l'égalité des pointeurs pour les fonctions dans Go chaque semaine

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.

La justification du changement

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.

Considérations relatives aux performances

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.

Utilisation du package Reflect

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.

Une solution valide

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.

Dernier tutoriel Plus>

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