


Comment effectuer des assertions de type sur des données JSON non marshalées dans Go ?
Assertions de type avec des données non marshalées
Dans un système distribué, les données sont souvent échangées sous forme de chaînes JSON. Lors de la récupération de données JSON à partir d'une file d'attente de messages, vous pouvez rencontrer un scénario dans lequel vous devez désérialiser les données dans une interface {}, puis effectuer des assertions de type pour déterminer le type de structure réel des données.
Problème
Lors du déclassement de la chaîne JSON reçue dans une interface{} et de la tentative de saisie du résultat, vous pouvez rencontrer un résultat inattendu. Au lieu du type de structure attendu, vous obtenez une map[string]interface{}.
Solution
Le comportement par défaut du démarshaling JSON dans une interface{} donne des types tels que bool, float64, string, []interface{} et map[string]interface{}. Puisque Something1 et Something2 sont des structures personnalisées, elles ne sont pas reconnues par le démarshaler JSON.
Pour résoudre ce problème, il existe deux approches principales :
1. Démarrez directement dans les structures personnalisées
Code :
var input Something1 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here var input Something2 json.Unmarshal([]byte(msg), &input) // Type assertions and processing can be performed here
2. Décompresser depuis Map Interface
Code :
var input interface{} json.Unmarshal([]byte(msg), &input) // Unpack the data from the map switch v := input.(type) { case map[string]interface{}: // Extract the data from the map and assign it to custom structs }
Approche avancée
Pour une solution plus polyvalente, envisagez de créer une structure "Unpacker" qui gère le démarshalage et l'assertion de type processus.
Code :
type Unpacker struct { Data interface{} } func (u *Unpacker) UnmarshalJSON(b []byte) error { 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 }
Conclusion
En utilisant l'une de ces approches, vous pouvez effectuer avec succès un type assertions sur les données qui sont d'abord non marshalées dans une interface {} à partir d'une chaîne JSON. Le choix de l'approche dépend des exigences spécifiques de votre application.
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!

Gooffersrobustfeaturesforsecucoding, ButdeveloversMustimplementSecurityBestPracticeseffectively.1) usego'scryptopackageforsecureatahandling.2) manageCurrencywithSynchronizationPrimiTeStOpreventraceConDITIONS.3)

L'interface d'erreur de Go est définie comme TypeErrorInterface {error () String}, permettant à tout type qui implémente la méthode Error () d'être considérée comme une erreur. Les étapes à utiliser sont les suivantes: 1. Fondamentalement, vérifiez et journalisez les erreurs, telles que IFERR! = NIL {log.printf ("ANERROROCCURRED:% V", ERR) RETOUR}. 2. Créez un type d'erreur personnalisé pour fournir plus d'informations, telles que TypeMyErrorStruct {msgStringDetailString}. 3. Utilisez des emballages d'erreur (depuis Go1.13) pour ajouter du contexte sans perdre le message d'erreur d'origine,

Toefficativement handleerrorsinconcurrentGOprograms, usEchannelStoCommunicateErrors, metterororwatchers, considérer les channeaux usuered, et les fournisseurs

Dans le langage Go, l'implémentation de l'interface est effectuée implicitement. 1) Implémentation implicite: Tant que le type contient toutes les méthodes définies par l'interface, l'interface sera automatiquement satisfaite. 2) Interface vide: Tous les types d'interface {} sont implémentés et une utilisation modérée peut éviter les problèmes de sécurité de type. 3) Isolement de l'interface: Concevez une interface petite mais ciblée pour améliorer la maintenabilité et la réutilisabilité du code. 4) Test: L'interface aide au test unitaire en moquant les dépendances. 5) Gestion des erreurs: l'erreur peut être gérée uniformément via l'interface.

Go'sterfacesaReImplicitlyImPlemented, contrairement à javaandc # qui requireexplicitimplementation.1) ingo, anyTypewithTherequuredMethodsautomAticy ImplementsanInterface, promotingsimplicity andflexibilité.2) jevaandc # demandexplicite

ToensineItFunctionsAreeEffective et montable: 1) Minizes au niveau des effets par rapport à la réduction destinés à Modifier GlobalState, 2)

GOISIDEALFORBEGINNERNERS et combinant pour pourcloudandNetWorkServicesDuetOtssimplicity, Efficiency, andCurrencyFeatures.1) InstallgofromTheofficialwebsiteandverifywith'goversion'..2)

Les développeurs doivent suivre les meilleures pratiques suivantes: 1. Gérer soigneusement les Goroutines pour empêcher la fuite des ressources; 2. Utilisez des canaux pour la synchronisation, mais évitez la surutilisation; 3. Gérer explicitement les erreurs dans les programmes simultanés; 4. Comprendre GomaxProcs pour optimiser les performances. Ces pratiques sont cruciales pour un développement logiciel efficace et robuste, car ils garantissent une gestion efficace des ressources, la mise en œuvre appropriée de la synchronisation, la gestion des erreurs appropriée et l'optimisation des performances, améliorant ainsi l'efficacité des logiciels et la maintenabilité.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft

Version Mac de WebStorm
Outils de développement JavaScript utiles

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel
