Maison  >  Article  >  développement back-end  >  Application et implémentation sous-jacente de la réflexion et de l'assertion de type dans les fonctions Golang

Application et implémentation sous-jacente de la réflexion et de l'assertion de type dans les fonctions Golang

王林
王林original
2023-05-16 12:01:47951parcourir

Application et implémentation sous-jacente de la réflexion de fonction Golang et de l'assertion de type

Dans la programmation Golang, la réflexion de fonction et l'assertion de type sont deux concepts très importants. La réflexion des fonctions nous permet d'appeler dynamiquement des fonctions au moment de l'exécution, et les assertions de type peuvent nous aider à effectuer des opérations de conversion de type lorsqu'il s'agit de types d'interface. Cet article discutera en profondeur de l'application de ces deux concepts et de leurs principes de mise en œuvre sous-jacents.

1. Réflexion de fonction

La réflexion de fonction fait référence à l'obtention d'informations spécifiques de la fonction lorsque le programme est en cours d'exécution, telles que le nom de la fonction, le nombre de paramètres, le type de paramètre, etc. Dans Golang, vous pouvez utiliser des API liées à la réflexion pour obtenir des informations sur les fonctions et appeler dynamiquement des fonctions au moment de l'exécution. Voici un exemple simple :

func add(a, b int) int {

return a + b

}

func main() {

x := reflect.ValueOf(add)
num := x.Call([]reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)})[0].Int()
fmt.Println(num)

}

Dans cet exemple, nous définissons d'abord une fonction add, qui reçoit deux paramètres de type int et renvoie une valeur de type int. Ensuite, nous utilisons la fonction reflex.ValueOf pour encapsuler la fonction add dans une variable x de type reflex.Value. Ensuite, nous appelons la méthode Call de x pour appeler dynamiquement la fonction add et transmettre les deux paramètres 1 et 2. Enfin, nous convertissons la valeur de retour de la méthode Call en type int et la produisons.

En plus d'utiliser la méthode Call pour appeler des fonctions, vous pouvez également utiliser la méthode Reflect.MakeFunc pour créer dynamiquement des fonctions. Voici un exemple :

func hello(name string) {

fmt.Printf("Hello, %v!

", name)
}

func main() {

fntype := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{}, false)
fnval := reflect.MakeFunc(fntype, func(args []reflect.Value) []reflect.Value {
    name := args[0].String()
    hello(name)
    return nil
})
fnval.Call([]reflect.Value{reflect.ValueOf("world")})

}

Dans cet exemple, nous définissons d'abord une fonction hello, qui reçoit un Le paramètre de type string ne renvoie pas de valeur. Ensuite, nous utilisons la fonction réfléchissant.FuncOf pour définir une fonction de type fntype, ce qui signifie qu'elle reçoit un paramètre de type chaîne et ne renvoie pas de valeur. Ensuite, nous utilisons le reflet. Méthode MakeFunc pour créer une fonction fnval, son type est fntype, et sa fonction d'implémentation appelle la fonction hello et passe un paramètre Enfin, nous utilisons la méthode Call de fnval pour appeler dynamiquement cette fonction et passer un paramètre "world". . 2. Assertion de type

L'assertion de type fait référence à la conversion d'un type d'interface en d'autres types lors de son traitement. Dans Golang, la valeur du type d'interface peut être convertie en valeur d'autres types via l'assertion de type. assertion est d'obtenir la valeur du type spécifié, et l'autre est d'obtenir le pointeur du type spécifié. Voici un exemple simple :

var i interface{} = "hello"

s1, ok1 := i. .(string)

fmt. Println(s1, ok1)


s2, ok2 := i.(*string)

fmt.Println(s2, ok2)


Dans cet exemple, nous définissons d'abord une variable i d'interface{ } type, et son affectation est une valeur de type chaîne "hello". Ensuite, nous utilisons une assertion de type pour convertir i en une valeur de type chaîne et l'enregistrons dans la variable s1. En même temps, l'assertion de type peut échouer, donc. nous utilisons la variable ok1 pour déterminer si elle réussit. La deuxième assertion de type convertit i en un pointeur de type *string et l'enregistre dans la variable s2. L'implémentation sous-jacente de la réflexion et de l'assertion de type

Dans Golang, La réflexion et l'assertion de type des fonctions sont toutes deux effectuées par l'implémentation du package.Dans la réflexion, deux structures, réflexion.Type et réflexion.Value, sont principalement utilisées, qui peuvent représenter respectivement les types et les valeurs.Les informations de type comprennent trois aspects : type. le nom, la taille du type et l'alignement du type. . Les informations sur la valeur incluent le type spécifique de la valeur, l'adresse de stockage de la valeur et la méthode de fonctionnement de la valeur.

Dans les assertions de type, le type d'interface {} et l'opérateur d'assertion de type sont. principalement utilisé pour stocker tout type de valeur.Et il peut être converti en d'autres types via l'assertion de type. L'opérateur d'assertion de type comprend deux formes, l'une consiste à obtenir la valeur du type spécifié et l'autre à obtenir le pointeur du type. type spécifié. L'opérateur d'assertion de type vérifie si la valeur cible est. Spécifie le type, si c'est le cas, renvoie une valeur ou un pointeur du type spécifié, sinon renvoie nul et faux.

En bref, la réflexion et l'assertion de type sont des concepts très importants dans la programmation Golang. Ils nous permettent d'obtenir dynamiquement des informations de type et de convertir les types pendant l'exécution du programme. L'implémentation de la réflexion et de l'assertion de type repose toutes deux sur le package Reflect et offre des performances et une convivialité élevées dans le langage Golang.

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