Maison >développement back-end >Golang >Comment puis-je comparer de manière fiable les pointeurs de fonction pour l'égalité en Go ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-12-18 09:35:11240parcourir

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

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

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 sur les 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.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn