Maison > développement back-end > Golang > Comment puis-je transmettre une valeur d'interface nulle à l'aide de Reflection in Go ?

Comment puis-je transmettre une valeur d'interface nulle à l'aide de Reflection in Go ?

Mary-Kate Olsen
Libérer: 2024-11-30 14:10:14
original
308 Les gens l'ont consulté

How Can I Pass a Nil Interface Value Using Reflection in Go?

Passer une valeur nulle comme interface via la réflexion dans Go

Dans Go, vous pouvez définir des fonctions avec des arguments d'interface. Bien qu'il soit simple de transmettre une valeur d'interface non nulle, la question se pose : comment transmettre une valeur nulle via la réflexion pour qu'elle réussisse une vérification == nil ?

Considérez la fonction suivante :

func f(e error) {
    if e == nil {
        fmt.Println("YEY! NIL") // how to get here?
    } else {
        fmt.Println("NOT NIL :(")
    }
}
Copier après la connexion

Approche 1 : Utilisation de Reflect.Zero

func main() {
    rf := reflect.ValueOf(f)

    nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil)
}
Copier après la connexion

Cette approche échoue car Reflect.Zero(reflect.TypeOf((error)(nil))) panique car vous ne pouvez pas créer une valeur nulle d'un type nul.

Approche 2 : Utilisation de Typeof(&type)

type MyError struct{}
func (e MyError) Error() string {
    return ""
}

func main() {
    rf := reflect.ValueOf(f)
    nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :(
}
Copier après la connexion

Cette approche échoue également en raison de l'élément Go FAQ sur les erreurs nulles, qui indique que les types d'interface peuvent être nuls ou pointer vers un type spécifique. Passer zéro spécifiquement n’est pas normal. Si vous essayez d'appeler une méthode sur une interface nulle, cela va paniquer.

Solution : utilisez TypeOf((*error)(nil)).Elem()

Pour passer correctement un nil valeur via la réflexion, utilisez l'expression Reflect.TypeOf((*error)(nil)).Elem() pour obtenir le Reflect.Type pour l'interface d'erreur. Cette expression crée une valeur non-interface et utilise des méthodes de réflexion pour obtenir le reflet souhaité.

Créez nilArg comme suit :

nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
Copier après la connexion

Avec cette approche, appeler f avec nilArg imprimera "OUI ! NIL."

Voir l'exemple du terrain de jeu pour une implémentation fonctionnelle.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal