Maison > développement back-end > Golang > le corps du texte

Comment gérer les valeurs nulles dans Golang ?

PHPz
Libérer: 2024-02-12 12:09:09
avant
1099 Les gens l'ont consulté

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"`
}
Copier après la connexion

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,
            },
        })
    }
}
Copier après la connexion

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"
}
Copier après la connexion

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",
        }
Copier après la connexion

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"`
}
Copier après la connexion

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}
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!