Trois lois de la réflexion du langage Go : Tout est une valeur : Des valeurs de tous types peuvent être stockées dans l'interface{}. Les types sont statiques : les informations de type obtenues ne changent pas une fois déterminées. La valeur est dynamique : une valeur réfléchie représente une instance spécifique et sa valeur peut être consultée et modifiée.
Go Language Reflection : Trois lois pour vous aider à comprendre l'essence de la réflexion
Go Language Reflection est un mécanisme puissant qui nous permet d'obtenir et de manipuler des informations de type d'exécution. Comprendre les trois lois de la réflexion est crucial car cela nous aide à saisir leur essence.
Première loi : tout a une valeur
Dans Go, tous les types de valeurs peuvent être stockés dans le type interface{}
. Reflection implémente le mécanisme sous-jacent de ce type. Cela signifie que nous pouvons utiliser le package reflect
pour manipuler des instances de n'importe quel type. interface{}
类型中。反射实现了此类型的底层机制。这意味着我们可以使用 reflect
包来操纵任何类型的实例。
例如:
type User struct { Name string Age int } func PrintUserInfo(u interface{}) { v := reflect.ValueOf(u) fmt.Println(v.Type()) fmt.Println(v.NumField()) for i := 0; i < v.NumField(); i++ { fmt.Printf("%s: %v\n", v.Type().Field(i).Name, v.Field(i).Interface()) } }
第二定律:类型是静态的
反射操作针对特定类型值进行。换句话说,一旦我们获取了类型的反射信息,它将不再发生变化。这确保了反射操作的稳定性。
例如:
type Point struct { X, Y int } func main() { pt := &Point{1, 2} t := reflect.TypeOf(pt) fmt.Println(t.Name()) // 输出: Point }
第三定律:Value 是动态的
反射 Value
type User struct { Name string Age int } func main() { u := &User{Name: "Alice", Age: 25} v := reflect.ValueOf(u) // 修改字段值 v.Elem().FieldByName("Name").SetString("Bob") fmt.Println(u.Name) // 输出: Bob }
Deuxième loi : les types sont statiques
Les opérations de réflexion sont effectuées sur des valeurs de type spécifiques. En d’autres termes, une fois que nous obtenons les informations de réflexion pour un type, elles ne changeront plus. Cela garantit un fonctionnement de réflexion stable. Par exemple :// 类型检查 func IsUser(v interface{}) bool { return reflect.TypeOf(v).Name() == "User" } // 字段提取 func GetFieldName(v interface{}) string { return reflect.TypeOf(v).Field(0).Name }
Valeur
représente une instance d'un type concret. Non seulement il peut accéder aux informations de type, mais il peut également modifier la valeur de l'instance. 🎜🎜Exemple : 🎜rrreee🎜🎜Exemple pratique : vérification de type et extraction de champs🎜🎜🎜Les cas d'utilisation courants pour la réflexion incluent la vérification de type et l'extraction de valeurs de champ de types inconnus. 🎜rrreee🎜En comprenant les trois lois de la réflexion, vous pouvez maîtriser l'essence de la réflexion du langage Go et utiliser pleinement ses puissantes fonctionnalités. 🎜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!