Maison >développement back-end >Golang >méthode d'appel de réflexion golang
Avant-propos
Dans Golang, le mécanisme de réflexion est une fonction importante. Il peut obtenir dynamiquement le type et la valeur des variables au moment de l'exécution, et peut appeler dynamiquement des méthodes, en particulier pour certaines implémentations de code universel et certaines. Le mécanisme de réflexion est essentiel pour l'implémentation. du cadre.
Cet article utilisera un exemple pour présenter comment utiliser les méthodes d'appel de réflexion dans Golang.
Introduction à la méthode d'appel de réflexion
La méthode d'appel de réflexion fait référence à l'appel dynamique de la fonction de l'objet au moment de l'exécution. Grâce au package de réflexion, vous pouvez obtenir dynamiquement l'objet au moment de l'exécution et appeler la méthode de l'objet. Bien entendu, avant d'appeler la méthode par réflexion, nous devons effectuer les traitements nécessaires sur le type d'objet, le nom de la méthode, le type de paramètre de la méthode, etc.
Dans Go, nous pouvons utiliser le package Reflect pour effectuer des méthodes d'appel de réflexion. Ce package fournit principalement les méthodes importantes suivantes :
Exemple de méthode d'appel de réflexion de base
Regardons un exemple de méthode d'appel de réflexion de base.
Supposons que nous ayons une structure de type Person :
type Person struct {
Name string Age int
}
Maintenant, nous voulons appeler la méthode GetName de la structure Person, mais nous ne connaissons pas le type de l'objet pour le moment. , nous devons utiliser le package Reflect pour implémenter la méthode d'appel de réflexion.
Tout d'abord, nous devons créer un objet Person et obtenir son objet de valeur de réflexion :
func main() {
person := &Person{Name: "Alice", Age: 18} value := reflect.ValueOf(person)
}
reflect.ValueOf(person) renvoie une valeur de type réflexion.Value, qui est un pointeur valeur pointant vers le type de structure de l'objet.Nous pouvons utiliser le code suivant pour obtenir le type de l'objet :
typ := reflect.TypeOf(person)
De cette façon, nous avons réussi à obtenir l'objet de valeur de réflexion et l'objet de type de réflexion de l'objet. pour obtenir l'objet méthode GetName. Reflection, le code est le suivant :
method := value.MethodByName("GetName")
S'il n'y a pas de méthode GetName dans l'objet, la méthode renverra la valeur zéro réflexion.Value{}.
Maintenant que nous avons obtenu l'objet méthode de réflexion de la méthode, nous pouvons appeler la méthode et obtenir la valeur de retour :
res := method.Call(nil) fmt.Println(res[0].String())
Pour appeler une méthode, vous devez utiliser la méthode Call, qui accepte une liste de paramètres (reflect. Type de tranche de valeur), et renvoie une liste de valeurs de type tranche. Étant donné que la méthode GetName ne transmet pas de paramètres, nous pouvons transmettre une tranche nulle.
Exemple complet de méthode d'appel de réflexion
Maintenant que nous avons compris comment appeler des méthodes de base à l'aide de la réflexion, nous allons en apprendre davantage sur la méthode d'appel de réflexion avec un exemple complet.
Nous définissons une interface UsbDevice, qui contient deux méthodes, à savoir Connect et Disconnect :
type Interface UsbDevice {
Connect() error Disconnect() error
}
Nous définissons ensuite un type FlashDisk et implémentons les deux méthodes de l'interface UsbDevice :
tapez FlashDisk struct {
Name string
}
func (f *FlashDisk) Erreur Connect() {
fmt.Printf("%s 连接成功
", f.Name)
return nil
}
func (f *FlashDisk) Erreur Disconnect() {
fmt.Printf("%s 断开连接
", f.Name)
return nil
}
Maintenant, nous devons utiliser la réflexion pour appeler dynamiquement la méthode de type FlashDisk.
Tout d'abord, nous devons créer un objet FlashDisk et obtenir son objet de valeur de réflexion :
func main() {
flashDisk := &FlashDisk{Name: "闪迪 U 盘"} value := reflect.ValueOf(flashDisk)
}
Ensuite, nous devons obtenir l'objet de méthode de réflexion des méthodes Connect et Disconnect :
connectMethod := value.MethodByName("Connect") disconnectMethod := value.MethodByName("Disconnect")
Remarque, ici, nous devons nous assurer que les méthodes Connect et Disconnect existent dans l'objet, sinon l'objet de méthode de réflexion obtenu ici renverra la valeur zéro reflex.Value{}.
Ensuite, nous utilisons la méthode Call pour appeler ces deux méthodes :
connectRes := connectMethod.Call(nil) disconnectRes := disconnectMethod.Call(nil)
Lors de l'appel de la méthode Call, vous devez transmettre une liste de paramètres Puisque les méthodes Connect et Disconnect n'ont pas de paramètres, nous pouvons transmettre une tranche nulle. .
Le code complet est le suivant :
package main
import (
"fmt" "reflect"
)
type UsbDevice interface {
Connect() error Disconnect() error
}
type FlashDisk struct {
Name string
}
func (f *FlashDisk k) Connectez-vous () erreur {
fmt.Printf("%s 连接成功
", f.Name)
return nil
}
func (f *FlashDisk) Disconnect() erreur {
fmt.Printf("%s 断开连接
", f.Name)
return nil
}
func main() {
flashDisk := &FlashDisk{Name: "闪迪 U 盘"} fmt.Println("使用反射调用方法:") value := reflect.ValueOf(flashDisk) connectMethod := value.MethodByName("Connect") disconnectMethod := value.MethodByName("Disconnect") connectRes := connectMethod.Call(nil) disconnectRes := disconnectMethod.Call(nil) fmt.Println(connectRes) fmt.Println(disconnectRes)
}
Exécutez le programme ci-dessus, le résultat de sortie est :
Utilisez la réflexion pour appeler la méthode :
La connexion au disque SanDisk U est réussie
[]
[]
À ce stade, nous avons utilisé avec succès la réflexion pour appeler les méthodes Connect et Disconnect de type FlashDisk.
Résumé
Cet article montre comment utiliser la réflexion pour appeler des méthodes à travers un exemple complet, en utilisant principalement les méthodes ValueOf, TypeOf, MethodByName et Call du package Reflect. Nous pouvons utiliser ces méthodes pour obtenir dynamiquement la valeur, le type, la méthode, etc. de l'objet, et appeler dynamiquement la méthode de l'objet au moment de l'exécution. Il convient de noter que la méthode appelante de réflexion doit d'abord s'assurer que la méthode spécifiée existe dans l'objet, sinon l'appel renverra une valeur nulle réflexion.Value{}. Les méthodes d'appel de réflexion sont très utiles dans certaines situations et peuvent nous aider à implémenter certaines implémentations de code et de framework courantes.
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!