Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit Nullwerten in Golang um?

Wie gehe ich mit Nullwerten in Golang um?

PHPz
PHPznach vorne
2024-02-12 12:09:091103Durchsuche

Wie gehe ich mit Nullwerten in Golang um?

php-Editor Yuzai stellt Ihnen vor, wie Sie mit Nullwerten in Golang umgehen. In Golang bedeutet ein Nullwert normalerweise, dass der Variablen kein Wert zugewiesen wurde oder sie keinen gültigen Wert hat. Um Nullwerte zu verarbeiten, bietet Golang mehrere Methoden. Erstens können Sie eine bedingte Anweisung (if-Anweisung) verwenden, um zu prüfen, ob eine Variable Null ist. Zweitens können Sie die Variable mit einem Standardwert initialisieren, um sicherzustellen, dass die Variable nicht leer ist. Darüber hinaus können Sie anstelle eines Nullwerts auch einen Nullwert verwenden. Bei einer numerischen Variablen ist der Nullwert beispielsweise 0; bei einer Zeichenfolgenvariablen ist der Nullwert eine leere Zeichenfolge. Sie können Zeiger auch verwenden, um Nullwerte zu verarbeiten und festzustellen, ob eine Variable null ist, indem Sie beurteilen, ob der Zeiger Null ist. Darüber hinaus bietet Golang auch einige spezielle Datentypen wie Slices, Maps und Channels, die bei der Deklaration standardmäßig auf Null gesetzt sind und Nullwerte verarbeiten können, indem bestimmt wird, ob sie Null sind. Kurz gesagt, Golang bietet eine Vielzahl flexibler Möglichkeiten zum Umgang mit Nullwerten, und Entwickler können basierend auf bestimmten Szenarien die geeignete Methode zum Umgang mit Nullwerten auswählen.

Frageninhalt

Benutzermodell

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

Benutzer aktualisieren

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,
            },
        })
    }
}

Ich habe versucht, die Daten per Postbote zu aktualisieren, aber wenn der Wert == null ist, werden sie aus der Sammlung entfernt

In diesem Fall möchte ich den Titel des Benutzers aktualisieren, bevor die Aktualisierung aller Daten bereits erfolgt ist

Postbote

{
    "title": "user one"
}

Es wird daran gearbeitet, den Titel in der Sammlung zu ändern. Andere Daten (Name und Standort) sind jedoch verschwunden

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

Wie geht man also mit Nullwerten im Anfragetext um?

Ich möchte nur den Titel dieses Falls ändern

Workaround

Normalerweise werden solche Teilaktualisierungen mit einer Struktur wie dieser gehandhabt:

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

Achten Sie auf die Hinweise. Auf diese Weise können API-Aufrufer Werte ungleich Null für die Felder senden, die sie aktualisieren möchten. Es kann auch eine leere Zeichenfolge verwendet werden, um den Feldwert auf Null zu setzen.

Dann müssen Sie auf der Datenbankseite eine Update-Anweisung erstellen:

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}

Dann verwenden Sie update, um den Datenbankeintrag zu aktualisieren.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Nullwerten in Golang um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen