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

Explication détaillée des points de connaissance pertinents des paramètres de réflexion Golang

PHPz
Libérer: 2023-04-03 13:37:17
original
529 Les gens l'ont consulté

Golang est un langage typé statiquement avec des fonctionnalités orientées objet. La réflexion est la capacité d'obtenir le type d'une valeur et d'opérer dessus au moment de l'exécution. Golang dispose d'un mécanisme de réflexion intégré, qui peut modifier la valeur d'attribut d'un objet par réflexion. Cet article présentera les points de connaissance pertinents sur les paramètres de réflexion Golang.

1. Type de réflexion

Tout d'abord, vous devez comprendre les types de réflexion couramment utilisés dans Golang. Dans Golang, le type de réflexion (reflect.Type) est un type d'interface. Il définit les informations de type d'un objet, y compris le nom du type, la taille du type, l'alignement, l'ensemble de méthodes, etc.

Dans Golang, nous pouvons obtenir les informations de type d'un objet par réflexion. Par exemple, le code suivant peut obtenir les informations de type de la variable a :

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a = 10
    t := reflect.TypeOf(a)
    fmt.Println("TypeOf a:", t)
}
Copier après la connexion

Le résultat de sortie est le suivant :

TypeOf a: int
Copier après la connexion

Comme vous pouvez le voir, nous avons obtenu le type de variable a via reflect.TypeOf code>, et le résultat obtenu Il est de type <code>int. reflect.TypeOf函数获取了变量a的类型,得到的结果是int类型。

除了基本类型之外,还可以通过反射获取结构体、函数、指针等类型的信息。比如,下面的代码可以获取结构体的类型信息:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var p = Person{"John", 30}
    t := reflect.TypeOf(p)
    fmt.Println("TypeOf p:", t)
}
Copier après la connexion

输出结果如下:

TypeOf p: main.Person
Copier après la connexion

可以看到,我们通过reflect.TypeOf函数获取了结构体Person的类型信息。

2. 反射值

除了反射类型之外,Golang中还有一个反射值(reflect.Value)的概念。反射值是一个接口类型,包含了一个对象的值和类型信息。在Golang中,我们可以通过反射获取一个对象的值和类型信息。比如,下面的代码可以获取变量a的值和类型信息:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var a = 10
    v := reflect.ValueOf(a)
    fmt.Println("ValueOf a:", v)
    fmt.Println("TypeOf a:", v.Type())
}
Copier après la connexion

输出结果如下:

ValueOf a: 10
TypeOf a: int
Copier après la connexion

可以看到,我们通过reflect.ValueOf函数获取了变量a的值和类型信息。

同样的,除了基本类型之外,还可以通过反射获取结构体、函数、指针等类型的值和类型信息。比如,下面的代码可以获取结构体的值和类型信息:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var p = Person{"John", 30}
    v := reflect.ValueOf(p)
    fmt.Println("ValueOf p:", v)
    fmt.Println("TypeOf p:", v.Type())
}
Copier après la connexion

输出结果如下:

ValueOf p: {John 30}
TypeOf p: main.Person
Copier après la connexion

可以看到,我们通过reflect.ValueOf函数获取了结构体Person的值和类型信息。

3. 反射设置

当我们获取到一个对象的类型和值之后,就可以利用反射修改对象的属性值。一般来说,我们可以通过反射的Elem()方法获取指针指向的值。比如,下面的代码可以修改结构体的属性值:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var p = &Person{"John", 30}
    v := reflect.ValueOf(p).Elem()
    nameValue := v.FieldByName("Name")
    nameValue.SetString("Tom")
    fmt.Println(p)
}
Copier après la connexion

输出结果如下:

&{Tom 30}
Copier après la connexion

可以看到,我们通过反射的FieldByName方法获取了结构体属性的值,并使用SetString方法修改了Name属性的值。

除了修改结构体属性的值之外,还可以通过反射修改函数的参数值。比如,下面的代码可以修改函数的参数值:

package main

import (
    "fmt"
    "reflect"
)

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

func main() {
    f := reflect.ValueOf(Add)
    args := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}
    f.Call(args)
    fmt.Println("Before:", args)
    args[0] = reflect.ValueOf(100)
    args[1] = reflect.ValueOf(200)
    f.Call(args)
    fmt.Println("After:", args)
}
Copier après la connexion

输出结果如下:

Before: [10 20]
After: [100 200]
Copier après la connexion

可以看到,我们通过反射的Call方法,调用了函数Add

En plus des types de base, vous pouvez également obtenir une structure, une fonction, un pointeur et d'autres types d'informations par réflexion. Par exemple, le code suivant peut obtenir les informations de type de la structure :

rrreee

Le résultat de sortie est le suivant :

rrreee

Comme vous pouvez le voir, nous avons obtenu la structure Person via le Reflect.TypeOf code de fonction> informations de type.
  • 2. Valeur de réflexion
  • En plus du type de réflexion, il existe également un concept de valeur de réflexion (reflect.Value) dans Golang. Une valeur réfléchie est un type d'interface qui contient les informations sur la valeur et le type d'un objet. Dans Golang, nous pouvons obtenir la valeur et les informations de type d'un objet par réflexion. Par exemple, le code suivant peut obtenir les informations sur la valeur et le type de la variable a :
  • rrreee
  • Le résultat de sortie est le suivant :
  • rrreee
Comme vous pouvez le voir, nous avons obtenu la valeur et le type de la variable a via le reflect Informations sur la fonction .ValueOf.

De même, en plus des types de base, vous pouvez également obtenir des valeurs et des informations de type de structures, fonctions, pointeurs et autres types par réflexion. Par exemple, le code suivant peut obtenir les informations de valeur et de type de la structure :

rrreee

Le résultat de sortie est le suivant : 🎜rrreee🎜Comme vous pouvez le voir, nous avons obtenu la structure Person via le <code>reflect. Valeur et informations de type de la fonction ValueOf . 🎜🎜3. Paramètres de réflexion🎜🎜Après avoir obtenu le type et la valeur d'un objet, nous pouvons utiliser la réflexion pour modifier les valeurs d'attribut de l'objet. D'une manière générale, nous pouvons obtenir la valeur pointée par le pointeur via la méthode réfléchie Elem(). Par exemple, le code suivant peut modifier la valeur de l'attribut de la structure : 🎜rrreee🎜Le résultat de sortie est le suivant : 🎜rrreee🎜Comme vous pouvez le voir, nous obtenons la valeur de l'attribut de la structure via le FieldByName réfléchi. code> et utilisez la méthode <code>SetString pour modifier la valeur de l'attribut Name. 🎜🎜En plus de modifier les valeurs des attributs de structure, vous pouvez également modifier les valeurs des paramètres de fonction par réflexion. Par exemple, le code suivant peut modifier la valeur du paramètre de la fonction : 🎜rrreee🎜Le résultat de sortie est le suivant : 🎜rrreee🎜Comme vous pouvez le voir, nous avons appelé la fonction Ajoutervia le réfléchi. Appeler la méthode >Et modifier les paramètres de la fonction. 🎜🎜4. Notes🎜🎜Lors de l'utilisation des paramètres de réflexion Golang, vous devez faire attention aux points suivants : 🎜🎜🎜Les paramètres de réflexion ne peuvent modifier que les champs exportés au niveau du package, mais pas les champs non exportés. Erreurs de type au moment de la compilation ou paniques à l'exécution, vous devez donc l'utiliser avec prudence 🎜🎜Les performances des paramètres de réflexion sont faibles et peuvent affecter l'efficacité de l'exécution du programme ; 🎜🎜🎜5. Résumé🎜🎜Les paramètres de réflexion Golang sont une fonctionnalité puissante qui peut obtenir le type d'un objet et la possibilité de l'opérer au moment de l'exécution. Dans cet article, nous présentons les points de connaissances pertinents sur les types de réflexion, les valeurs de réflexion et les paramètres de réflexion dans Golang. En étudiant cet article, je pense que les lecteurs ont une compréhension plus approfondie des paramètres 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