Maison > développement back-end > Golang > le corps du texte

[Résumé] Quelques utilisations courantes de la réflexion Golang

PHPz
Libérer: 2023-03-30 09:42:38
original
658 Les gens l'ont consulté

Golang est un langage de programmation typé statiquement, mais il fournit également un mécanisme de réflexion qui peut obtenir les informations de type des variables au moment de l'exécution, ainsi qu'appeler dynamiquement des méthodes et modifier des propriétés. La réflexion est une fonctionnalité courante dans la programmation Golang. Cet article présentera quelques utilisations courantes de la réflexion Golang.

Connaissance de base de la réflexion

La réflexion est une fonctionnalité importante de Golang, qui permet au programme d'identifier dynamiquement les types d'objets et d'effectuer des opérations au moment de l'exécution. Grâce à la réflexion, nous pouvons accéder à tous les membres, méthodes, étiquettes et autres informations d'une structure.

Dans Golang, la réflexion peut être utilisée pour effectuer les trois tâches suivantes :

  1. Interroger les informations de type des variables
  2. Obtenir la valeur réelle de la variable
  3. Modifier la valeur de la variable

La réflexion est principalement effectuée par reflect Cette implémentation de bibliothèque standard peut obtenir des informations pertinentes telles que le type et la valeur des variables en appelant certaines méthodes de la bibliothèque reflect. reflect这个标准库实现,通过调用reflect库中的一些方法,可以获取变量的类型以及值等相关信息。

反射的常见用法

获取变量的类型

通过反射,我们可以获取任意变量的类型信息。下面是一个获取变量类型的例子:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var num int = 100
    fmt.Println(reflect.TypeOf(num))
}
Copier après la connexion

运行上面的代码,将输出变量num的类型int

获取变量的值

在Golang中,通过反射可以获取任意变量的实际值。下面是一个获取变量值的例子:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var num int = 100
    fmt.Println(reflect.ValueOf(num))
}
Copier après la connexion

运行上面的代码,将输出变量num的值100

修改变量的值

通过反射,我们不仅可以获取变量的类型和值,还可以修改变量的值。下面是一个修改变量值的例子:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var num int = 100
    fmt.Println("before:", num)

    value := reflect.ValueOf(&num)
    value.Elem().SetInt(200)

    fmt.Println("after:", num)
}
Copier après la connexion

运行上面的代码,将输出变量num修改前后的值。

获取结构体的成员信息

在Golang中,我们可以通过反射获取结构体的成员信息。下面是一个获取结构体成员信息的例子:

package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string
    Age  int
}

func main() {
    user := &User{Name: "Tom", Age: 18}
    
    t := reflect.TypeOf(user).Elem()
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        fmt.Println(field.Name)
        fmt.Println(field.Type)
        fmt.Println(field.Tag)
    }
}
Copier après la connexion

运行上面的代码,将输出结构体User的所有成员信息。

动态调用函数

通过反射,我们可以动态调用函数。下面是一个动态调用函数的例子:

package main

import (
    "fmt"
    "reflect"
)

func Sum(a, b int) int {
    return a + b
}

func main() {
    fn := reflect.ValueOf(Sum)
    args := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}

    result := fn.Call(args)
    fmt.Println(result[0].Int())
}
Copier après la connexion

运行上面的代码,将输出函数Sum计算的结果3。在函数Call中,参数args为一个切片,里面存储了函数的参数值。同理,也可以使用reflect.ValueOf动态调用方法。不过需要注意的是,方法的第一个参数是接收者对象,需要使用reflect.ValueOf

Utilisations courantes de la réflexion

Obtenir le type d'une variable

Grâce à la réflexion, nous pouvons obtenir les informations de type de n'importe quelle variable. Voici un exemple d'obtention du type de variable :

rrreee

L'exécution du code ci-dessus affichera le type int de la variable num. 🎜

Obtenir la valeur d'une variable

🎜Dans Golang, vous pouvez obtenir la valeur réelle de n'importe quelle variable par réflexion. Voici un exemple d'obtention de la valeur d'une variable : 🎜rrreee🎜L'exécution du code ci-dessus affichera la valeur de la variable num 100. 🎜

Modifier la valeur de la variable

🎜Par réflexion, nous pouvons non seulement obtenir le type et la valeur de la variable, mais également modifier la valeur de la variable. Voici un exemple de modification de la valeur d'une variable : 🎜rrreee🎜Exécutez le code ci-dessus et la valeur de la variable num avant et après modification sera affichée. 🎜

Obtenir les informations sur les membres de la structure

🎜Dans Golang, nous pouvons obtenir les informations sur les membres de la structure par réflexion. Voici un exemple d'obtention d'informations sur les membres de la structure : 🎜rrreee🎜L'exécution du code ci-dessus affichera toutes les informations sur les membres de la structure Utilisateur. 🎜

Fonction d'appel dynamique

🎜Grâce à la réflexion, nous pouvons appeler dynamiquement des fonctions. Voici un exemple d'appel dynamique d'une fonction : 🎜rrreee🎜L'exécution du code ci-dessus affichera le résultat 3 calculé par la fonction Somme. Dans la fonction Call, le paramètre args est une tranche qui stocke les valeurs des paramètres de la fonction. De la même manière, vous pouvez également utiliser reflect.ValueOf pour appeler dynamiquement des méthodes. Cependant, il convient de noter que le premier paramètre de la méthode est l'objet récepteur, qui doit être encapsulé à l'aide de reflect.ValueOf. 🎜🎜Résumé🎜🎜Cet article présente les utilisations courantes de la réflexion Golang, notamment l'obtention de types de variables, l'obtention de valeurs de variables, la modification de valeurs de variables, l'obtention d'informations sur les membres des structures, l'appel dynamique de fonctions, etc. Je pense que ces utilisations de la réflexion peuvent vous aider à mieux comprendre et utiliser le mécanisme de réflexion de 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!

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