Maison > développement back-end > Golang > méthode d'appel de réflexion golang

méthode d'appel de réflexion golang

WBOY
Libérer: 2023-05-15 10:28:37
original
1218 Les gens l'ont consulté

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 :

  • reflect.ValueOf : obtenez l'objet de valeur de réflexion de l'objet
  • reflect.TypeOf : obtenez l'objet de valeur de réflexion ; objet de type de réflexion de l'objet ;
  • reflect.MethodByName : obtenez l'objet de méthode de réflexion de l'objet de type spécifié en fonction du nom de la méthode ;
  • Method.Call : appelle une méthode et renvoie le résultat.

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
Copier après la connexion

}

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)
Copier après la connexion

}

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)
Copier après la connexion

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")
Copier après la connexion

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())
Copier après la connexion

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
Copier après la connexion
Copier après la connexion

}

Nous définissons ensuite un type FlashDisk et implémentons les deux méthodes de l'interface UsbDevice :

tapez FlashDisk struct {

Name string
Copier après la connexion
Copier après la connexion

}

func (f *FlashDisk) Erreur Connect() {

fmt.Printf("%s 连接成功
Copier après la connexion
Copier après la connexion

", f.Name)

return nil
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}

func (f *FlashDisk) Erreur Disconnect() {

fmt.Printf("%s 断开连接
Copier après la connexion
Copier après la connexion

", f.Name)

return nil
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}

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)
Copier après la connexion

}

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")
Copier après la connexion

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)
Copier après la connexion

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"
Copier après la connexion

)

type UsbDevice interface {

Connect() error
Disconnect() error
Copier après la connexion
Copier après la connexion

}

type FlashDisk struct {

Name string
Copier après la connexion
Copier après la connexion

}

func (f *FlashDisk k) Connectez-vous () erreur {

fmt.Printf("%s 连接成功
Copier après la connexion
Copier après la connexion

", f.Name)

return nil
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}

func (f *FlashDisk) Disconnect() erreur {

fmt.Printf("%s 断开连接
Copier après la connexion
Copier après la connexion

", f.Name)

return nil
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

}

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)
Copier après la connexion

}

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal