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
Susan Sarandonoriginal
2024-11-30 09:11:13312parcourir

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)

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>

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

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!

Déclaration:
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
Article précédent:Raccourcisseur d'URL dans GoArticle suivant:Raccourcisseur d'URL dans Go