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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-17 12:01:01891parcourir

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

Passer des valeurs nulles aux interfaces via la réflexion dans Go

Dans Go, les interfaces fournissent un moyen de représenter des valeurs de différents types comme une seule entité . Cependant, transmettre une valeur nulle à une interface comme argument peut être difficile, notamment via la réflexion.

Considérez la fonction f() qui prend une erreur d'interface comme argument :

func f(e error) {
    if e == nil {
        fmt.Println("YEY! NIL")
    } else {
        fmt.Println("NOT NIL :(")
    }
}

Supposons que nous voulions transmettre une valeur nulle à cette fonction en utilisant la réflexion. Deux approches sont tentées :

Approche 1 :

nilArg := reflect.Zero(reflect.TypeOf((error)(nil)))

Cependant, cette approche panique car Reflect.Zero(nil) n'est pas autorisé.

Approche 2 :

nilArg := reflect.Zero(reflect.TypeOf(&MyError{}))

Cette approche échoue car elle ne crée pas de valeur d'interface nulle pour l'erreur.

La solution réside dans l'utilisation de reflex.TypeOf((*error)(nil)).Elem() pour obtenir le type concret de l'erreur d'interface :

nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())

Cette astuce fonctionne car le passage d'un pointeur vers une valeur nulle pour réfléchir.TypeOf() permet au système de réflexion de déterminer le type concret. La méthode Elem() récupère ensuite le type sous-jacent du pointeur.

En créant nilArg à l'aide de cette expression, nous pouvons désormais transmettre une vraie valeur nulle à la fonction f() via la réflexion :

rf := reflect.ValueOf(f)
rf.Call([]reflect.Value{nilArg})

Cet appel exécutera correctement l'instruction if dans la fonction, en imprimant "YEY ! NIL".

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