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
Mary-Kate Olsenoriginal
2024-11-30 14:10:14304parcourir

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 :(")
    }
}

Approche 1 : Utilisation de Reflect.Zero

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

    nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil)
}

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 :(
}

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())

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!

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