Comprenez l'art d'obtenir des informations de type en langage Go : utilisez la fonction reflex.TypeOf() pour obtenir un objet de type afin d'obtenir des données détaillées sur le type. Utilisez des assertions de type pour forcer une valeur d'interface à un type spécifique et renvoyer une valeur de ce type si la conversion réussit. Utilisez le package encoding/json pour encoder et décoder les valeurs en chaînes JSON tout en préservant les informations de type. Des exemples pratiques montrent comment utiliser les informations de type pour la conversion de type dynamique et le décodage JSON personnalisé.
Dans le langage Go, obtenir des informations de type est un outil puissant qui permet aux développeurs d'inspecter et de traiter différents types de données au moment de l'exécution. Cet article explorera diverses méthodes pour obtenir des informations sur le type et fournira des exemples pratiques pour démontrer leur application.
reflect.TypeOf()
reflect.TypeOf()
reflect.TypeOf()
函数是最常用的获取类型信息的方法。它返回一个 reflect.Type
类型的对象,包含有关类型的丰富信息。
package main import "reflect" func main() { var x int = 42 t := reflect.TypeOf(x) fmt.Println(t.Kind()) // 输出:int }
type assertion
Type assertion 是获取类型信息的另一种方法。它将一个接口值强制转换为特定类型,如果转换成功则返回该类型的值,否则返回 nil
。
package main func main() { var x interface{} = 42 if i, ok := x.(int); ok { fmt.Println(i) // 输出:42 } }
encoding/json
encoding/json
包提供了编解码类型信息的方法。json.MarshalIndent()
reflect.TypeOf()
est la méthode la plus couramment utilisée pour obtenir des informations de type. Il renvoie un objet de type reflect.Type
contenant des informations riches sur le type. package main import "encoding/json" func main() { type Person struct { Name string Age int } p := Person{Name: "John", Age: 30} b, err := json.MarshalIndent(p, "", " ") if err != nil { log.Fatal(err) } fmt.Println(string(b)) // 输出:{ // "Name": "John", // "Age": 30 // } }
assertion de type
L'assertion de type est une autre façon d'obtenir des informations de type. Il convertit une valeur d'interface en un type spécifique et renvoie une valeur de ce type si la conversion réussit, sinon il renvoie nil
.
package main import "reflect" func main() { var x interface{} = 42 switch t := reflect.TypeOf(x); t.Kind() { case reflect.Int: fmt.Println("x is an int") case reflect.String: fmt.Println("x is a string") default: fmt.Println("x is an unknown type") } }
encoding/json
Le package encoding/json
fournit des méthodes pour encoder et décoder les informations de type. La fonction json.MarshalIndent()
encode et décode une valeur en chaîne JSON tout en préservant les informations de type. package main import ( "encoding/json" "fmt" "reflect" ) type Person struct { Name string Age int } func CustomUnmarshal(data []byte) (Person, error) { var p Person t := reflect.TypeOf(p) dec := json.NewDecoder(bytes.NewReader(data)) dec.UseNumber() // 忽略 JSON 数字作为浮点数 for { var key string if err := dec.Decode(&key); err != nil { return p, err } if key == "" { break } var val interface{} if field, ok := reflect.TypeOf(p).FieldByName(key); ok { val = reflect.New(field.Type).Interface() } else { val = map[string]interface{}{} } if err := dec.Decode(&val); err != nil { return p, err } reflect.ValueOf(&p).Elem().FieldByName(key).Set(reflect.ValueOf(val)) } return p, nil } func main() { data := []byte(`{ "Name": "John", "Age": 30, "Hobbies": ["running", "swimming"] }`) p, err := CustomUnmarshal(data) if err != nil { log.Fatal(err) } fmt.Println(p) // 输出:{John 30} }
Cas 1 : Conversion de type dynamique
L'acquisition d'informations de type peut réaliser une conversion de type dynamique et effectuer différentes opérations selon différents types. 🎜rrreee🎜🎜Cas 2 : Décodage personnalisé🎜🎜🎜Pour obtenir des informations de type, vous pouvez également personnaliser le décodeur JSON pour décoder différentes structures JSON en fonction de noms de types spécifiques. 🎜rrreee🎜En obtenant des informations sur les types, les développeurs peuvent obtenir des informations sur les types de données dans les programmes Go et créer un code flexible et évolutif. 🎜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!