Introduction : La fonction de réflexion du langage Go permet aux développeurs d'inspecter et de modifier la structure du code au moment de l'exécution, et d'obtenir des métadonnées de type et de valeur via des interfaces intégrées. Principe : basé sur les interfaces intégrées Reflect.Type (métadonnées de type), Reflect.Value (métadonnées de valeur) et Reflect.Kind (énumération de nom de type de base). Utilisation : vérifier le type, modifier la valeur. Exemple pratique : créez un type personnalisé et utilisez la réflexion pour générer une sortie JSON.
Anatomie de Go Reflection : Comprendre ses principes et son utilisation
Introduction
Reflection est une fonctionnalité avancée des langages de programmation qui permet aux applications d'inspecter et de modifier la structure de leur propre code au moment de l'exécution. La prise en charge de la réflexion dans le langage Go est très puissante, permettant aux développeurs d'approfondir l'application et d'effectuer de manière dynamique une vérification de type, une modification de valeur et une génération de code.
Principe
La réflexion Go est basée sur un ensemble d'interfaces intégrées :
reflect.Type
: Métadonnées représentant les types Go.reflect.Type
:表示 Go 类型的元数据。
reflect.Value
:表示 Go 值的元数据,包括其类型和底层值。reflect.Kind
:一个枚举类型,定义了各种基本类型的名称。通过使用这些接口,您可以获取有关 Go 类型和值的各种信息,例如类型名称、字段名和方法签名。
用法
检查类型
以下代码显示了如何检查http.Request
类型的字段:
import ( "fmt" "reflect" "net/http" ) func main() { req := http.Request{} t := reflect.TypeOf(req) for i := 0; i < t.NumField(); i++ { field := t.Field(i) fmt.Printf("%s: %s\n", field.Name, field.Type) } }
修改值
反射还可以修改 Go 值。以下代码显示了如何修改http.Request
reflect.Value
: représente les métadonnées d'une valeur Go, y compris son type et sa valeur sous-jacente.
reflect.Kind
: Un type d'énumération qui définit les noms de différents types de base.
En utilisant ces interfaces, vous pouvez obtenir diverses informations sur les types et les valeurs Go, telles que les noms de types, les noms de champs et les signatures de méthodes.
Usage Checking typeLe code suivant montre comment vérifier un champ de typehttp.Request
:
import ( "net/http" "reflect" ) func main() { req := http.Request{} // 获取 URL 字段的 reflect.Value field := reflect.ValueOf(&req).Elem().FieldByName("URL") // 检查 URL 字段是否可设置 if field.CanSet() { // 动态设置 URL 字段 newURL := &http.URL{Host: "example.com"} field.Set(reflect.ValueOf(newURL)) } }
http.Request
:
import ( "encoding/json" "fmt" "reflect" ) // 自定义类型 type Person struct { Name string Age int } func main() { // 反射获取 Person 类型 personType := reflect.TypeOf(Person{}) // 创建 Person 值 person := Person{"John", 30} // 创建 Person 值的 Value 对象 personValue := reflect.ValueOf(person) // 构建 JSON 输出 jsonOutput := fmt.Sprintf(`{"name": "%s", "age": %d}`, personValue.FieldByName("Name").String(), personValue.FieldByName("Age").Int(), ) // 输出 JSON fmt.Println(jsonOutput) }
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!