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!