Lorsque vous traitez des formulaires contenant des champs facultatifs, il est courant de représenter ces champs sous forme de chaînes vides, de fausses valeurs booléennes ou entiers de valeur zéro en JSON. Cependant, lors de l'utilisation de l'indicateur omitempty dans les structures Golang, ces valeurs sont explicitement ignorées lors du mappage, ce qui peut entraîner des problèmes lors de la mise à jour des documents dans MongoDB.
Considérez une structure Coupon dans Golang avec des champs marqués comme omitempty :
type Coupon struct { Id int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status bool `json:"status" bson:"status"` }
Lors de la sauvegarde initiale, tous les champs non vides sont stockés avec succès dans MongoDB. Cependant, lors des mises à jour ultérieures, si un champ facultatif a été modifié en une valeur vide (par exemple, une case à cocher non cochée), l'indicateur omitempty empêche la valeur vide d'être mappée dans la structure. En conséquence, l'opération de mise à jour ne parvient pas à modifier la valeur du champ existant.
Le problème se pose car les types bool et int n'ont que deux valeurs possibles (false et true, 0 et non nul, respectivement). Pour répondre à la nécessité de représenter trois états (pas de mise à jour, défini sur false ou défini sur true) pour les champs bool et les cas similaires pour les champs int, les champs de structure doivent être modifiés pour utiliser des pointeurs.
type Coupon struct { Id *int `json:"id,omitempty" bson:"_id,omitempty"` Name string `json:"name,omitempty" bson:"name,omitempty"` Status *bool `json:"status" bson:"status"` }
Avec les pointeurs, une valeur nulle représente un champ omis. Pour les pointeurs non nuls, la valeur pointée représente la valeur du champ. Ainsi, les scénarios suivants peuvent être gérés :
En utilisant des pointeurs et l'indicateur omitempty, vous pouvez gérer efficacement les champs facultatifs dans les structures Golang tout en garantissant que les mises à jour sont effectuées correctement sans remplacer les valeurs existantes dans MongoDB.
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!