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.
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) }
Le résultat de sortie est le suivant :
TypeOf a: int
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) }
输出结果如下:
TypeOf p: main.Person
可以看到,我们通过reflect.TypeOf
函数获取了结构体Person
的类型信息。
除了反射类型之外,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()) }
输出结果如下:
ValueOf a: 10 TypeOf a: int
可以看到,我们通过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()) }
输出结果如下:
ValueOf p: {John 30} TypeOf p: main.Person
可以看到,我们通过reflect.ValueOf
函数获取了结构体Person
的值和类型信息。
当我们获取到一个对象的类型和值之后,就可以利用反射修改对象的属性值。一般来说,我们可以通过反射的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) }
输出结果如下:
&{Tom 30}
可以看到,我们通过反射的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) }
输出结果如下:
Before: [10 20] After: [100 200]
可以看到,我们通过反射的Call
方法,调用了函数Add
rrreee
Comme vous pouvez le voir, nous avons obtenu la structurePerson
via le Reflect.TypeOf
code de fonction> informations de type. 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 structurePerson 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 Ajouter
via 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!