Wie gehe ich mit Nullwerten in Golang um?

PHPz
Freigeben: 2024-02-12 12:09:09
nach vorne
1077 Leute haben es durchsucht

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"`
}
Nach dem Login kopieren

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,
            },
        })
    }
}
Nach dem Login kopieren

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"
}
Nach dem Login kopieren

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",
        }
Nach dem Login kopieren

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"`
}
Nach dem Login kopieren

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}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!