Maison > développement back-end > Golang > Quand « json.Marshal » échoue-t-il lors du rassemblement d'une « map[string]string » dans Go ?

Quand « json.Marshal » échoue-t-il lors du rassemblement d'une « map[string]string » dans Go ?

Susan Sarandon
Libérer: 2024-11-30 09:11:13
original
236 Les gens l'ont consulté

When Does `json.Marshal` Fail When Marshaling a `map[string]string` in Go?

Marshaling map[string]string en JSON : quand peut-il renvoyer une erreur ?

Considérez l'extrait de code suivant :

m := map[string]string{}
//... do stuff to the map
b, err := json.Marshal(m)
Copier après la connexion

Normalement, le marshaling d'une chaîne map[string]en JSON ne renvoie pas d'erreurs. JSON prend en charge les chaînes comme clés et valeurs, et Go encode les valeurs de chaîne sous forme de séquences d'octets UTF-8. Même les caractères UTF-8 invalides sont remplacés par le caractère de remplacement Unicode.

m := map[string]string{"\xff": "a"}
data, err := json.Marshal(m)
// Output: {"\ufffd":"a"} <nil>
Copier après la connexion

Cependant, il est important de noter que les erreurs renvoyées doivent toujours être vérifiées, même si la documentation indique que l'erreur est généralement nulle.

Un problème potentiel plus obscur survient lorsqu'une chaîne map[string] est transmise simultanément à json.Marshal(). Depuis Go 1.6, le runtime peut détecter une utilisation abusive simultanée des cartes. Si un thread modifie une carte pendant qu'un autre thread parcourt celle-ci, le runtime peut planter l'application avec un message « erreur fatale : itération de carte simultanée et écriture de carte ».

Cette situation peut être provoquée comme suit :

m := map[string]string{"\xff": "a"}

go func() {
    for i := 0; i < 10000; i++ {
        m["x"] = "b"
    }
}()

for i := 0; i < 10000; i++ {
    if _, err := json.Marshal(m); err != nil {
        panic(err)
    }
}
// Output: fatal error: concurrent map iteration and map write
Copier après la connexion

Par conséquent, il est crucial d'assurer une synchronisation appropriée lors de la modification et du regroupement simultanés des cartes.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal