Maison >développement back-end >Golang >Comment puis-je comparer en toute sécurité les pointeurs de fonction pour Identity in Go ?

Comment puis-je comparer en toute sécurité les pointeurs de fonction pour Identity in Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 17:55:09699parcourir

How Can I Safely Compare Function Pointers for Identity in Go?

É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!

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