Maison  >  Article  >  développement back-end  >  Comment gérer les valeurs nulles dans Golang ?

Comment gérer les valeurs nulles dans Golang ?

PHPz
PHPzavant
2024-02-12 12:09:091100parcourir

Comment gérer les valeurs nulles dans Golang ?

l'éditeur php Yuzai vous présente comment gérer les valeurs nulles dans Golang. En golang, une valeur nulle signifie généralement que la variable n'a pas reçu de valeur ou n'a pas de valeur valide. Pour gérer les valeurs nulles, golang propose plusieurs méthodes. Tout d’abord, vous pouvez utiliser une instruction conditionnelle (instruction if) pour vérifier si une variable est nulle. Deuxièmement, vous pouvez initialiser la variable avec une valeur par défaut pour vous assurer qu'elle n'est pas vide. De plus, vous pouvez également utiliser une valeur zéro au lieu d'une valeur nulle. Par exemple, pour une variable de type numérique, la valeur zéro est 0 ; pour une variable de type chaîne, la valeur zéro est une chaîne vide. Vous pouvez également utiliser des pointeurs pour gérer les valeurs nulles et déterminer si une variable est nulle en jugeant si le pointeur est nul. De plus, golang fournit également certains types de données spéciaux, tels que des tranches, des cartes et des canaux, qui par défaut sont nuls lorsqu'ils sont déclarés, et peuvent gérer les valeurs nulles en déterminant si elles sont nulles. En bref, Golang offre une variété de méthodes flexibles pour gérer les valeurs nulles, et les développeurs peuvent choisir la méthode appropriée pour gérer les valeurs nulles en fonction de scénarios spécifiques.

Contenu de la question

Modèle utilisateur

type userexample struct {
    id       primitive.objectid `json:"id,omitempty"`
    name     string             `json:"name,omitempty"`
    location string             `json:"location,omitempty"`
    title    string             `json:"title,omitempty"`
}

Mettre à jour l'utilisateur

func updateuserexample() gin.handlerfunc {
    return func(c *gin.context) {
        ctx, cancel := context.withtimeout(context.background(), 10*time.second)
        userid := c.param("userid")
        var user models.userexample
        defer cancel()
        objid, _ := primitive.objectidfromhex(userid)

        //validate the request body
        if err := c.bindjson(&user); err != nil {
            c.json(http.statusbadrequest, responses.userresponseexample{
                status:  http.statusbadrequest,
                message: "error",
                data: map[string]interface{}{
                    "data": err.error()},
            })
        }

        update := bson.m{
            "name":     user.name,
            "location": user.location,
            "title":    user.title,
        }
        result, err := usercollectionexample.updateone(ctx, bson.m{
            "id": objid,
        }, bson.m{
            "$set": update,
        })
        if err != nil {
            c.json(http.statusinternalservererror, responses.userresponseexample{
                status:  http.statusinternalservererror,
                message: "error",
                data: map[string]interface{}{
                    "data": err.error(),
                }})
            return
        }

        //get update userexample detail
        var updateuser models.userexample
        if result.matchedcount == 1 {
            err := usercollectionexample.findone(ctx, bson.m{
                "id": objid,
            }).decode(&updateuser)
            if err != nil {
                c.json(http.statusinternalservererror, responses.userresponseexample{
                    status:  http.statusinternalservererror,
                    message: "error",
                    data: map[string]interface{}{
                        "data": err.error(),
                    }})
                return
            }
        }
        c.json(http.statusok, responses.userresponseexample{
            status:  http.statusok,
            message: "success",
            data: map[string]interface{}{
                "data": updateuser,
            },
        })
    }
}

J'ai essayé de mettre à jour les données via postman mais si value == null elles seront supprimées de la collection

Dans ce cas, je souhaite mettre à jour le titre de l'utilisateur, avant de mettre à jour toutes les données sont déjà là

Facteur

{
    "title": "user one"
}

Il travaille sur le changement du titre dans la collection. Cependant, d'autres données (nom et localisation) ont disparu

"data": {
            "id": "63d2ac86aeb9d78d3d5daf21",
            "title": "User One",
        }

Alors, comment gérer les valeurs nulles dans le corps de la requête ?

Je veux juste changer le titre de ce cas

Solution de contournement

Habituellement, ces mises à jour partielles sont gérées à l'aide d'une structure comme celle-ci :

type userupdaterequest struct {
    id       primitive.objectid `json:"id,omitempty"`
    name     *string             `json:"name,omitempty"`
    location *string             `json:"location,omitempty"`
    title    *string             `json:"title,omitempty"`
}

Faites attention aux pointeurs. De cette façon, les appelants d'API peuvent envoyer des valeurs non nulles pour les champs qu'ils souhaitent mettre à jour. Il peut également utiliser une chaîne vide pour définir la valeur du champ sur null.

Ensuite, côté base de données, vous devez créer une instruction de mise à jour :

updateFields:=bson.M{}
if request.Name!=nil {
   updateFields["name"]=*request.Name
}
if request.Location!=nil {
   updateFields["location"]=*request.Location
}
// etc.
update:=bson.M{"$set":updateFields}

Ensuite, utilisez update pour mettre à jour l'enregistrement de la base de données.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer