Maison >développement back-end >Golang >Comment puis-je gérer efficacement l'assertion de type après avoir désorganisé JSON dans l'interface {} dans Go ?
Dans ce scénario, les chaînes JSON sont transmises via RabbitMQ. Ces chaînes représentent des instances de deux structures différentes, Somthing1 et Somthing2. L'objectif est de réorganiser les chaînes JSON dans leurs structures respectives et d'effectuer des assertions de type.
À première vue, il semble que la désorganisation dans une interface{} puis l'application d'assertions de type devrait suffire. Cependant, lors du désorganisation, la variable d'entrée est de type map[string]interface{}. Ce n'est pas comme prévu et les tentatives d'activation de ce type ou de le réaffecter aux structures souhaitées échouent.
La bibliothèque JSON de Golang désorganise les types par défaut tels que bool, float64 et map[string]interface{}. Pour obtenir les structures souhaitées, vous devez les désorganiser directement ou les convertir manuellement à partir de l'interface map[string]{}.
L'approche préférée consiste à désorganiser directement dans le structs :
func typeAssert(msg string) { var job Somthing1 json.Unmarshal([]byte(msg), &job) // ... var stats Somthing2 json.Unmarshal([]byte(msg), &stats) // ... }
Si la désorganisation directe n'est pas réalisable, vous pouvez utiliser une structure Unpacker pour gérer la désorganisation et fournir une interface pour accéder aux données :
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { // Attempt to unmarshal into both types smth1 := &Something1{} err := json.Unmarshal(b, smth1) if err == nil && smth1.Thing != "" { u.Data = smth1 return nil } smth2 := &Something2{} err = json.Unmarshal(b, smth2) if err != nil { return err } u.Data = smth2 return nil }
Ensuite, vous pouvez utiliser le Unpacker pour accéder aux données non organisées :
func typeAssert(msg string) { unpacker := &Unpacker{} json.Unmarshal([]byte(msg), unpacker) switch v := unpacker.Data.(type) { case Something1: // ... case Something2: // ... default: // Handle unknown type } }
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!