Heim > Backend-Entwicklung > Golang > Wie kann man SQL-NULL-Werte und ihre JSON-Darstellung in Go effizient verarbeiten?

Wie kann man SQL-NULL-Werte und ihre JSON-Darstellung in Go effizient verarbeiten?

Mary-Kate Olsen
Freigeben: 2025-01-03 06:22:39
Original
255 Leute haben es durchsucht

How to Efficiently Handle SQL NULL Values and Their JSON Representation in Go?

Effizientes Arbeiten mit SQL-NULL-Werten und JSON

In diesem Artikel befassen wir uns mit dem Dilemma der Arbeit mit SQL-NULL-Werten in Go und dem Umgang damit JSON-Darstellung effektiv.

Bei der Verwendung von Go-Typen wie int64 und string können Nullwerte nicht direkt gespeichert werden. Zu diesem Zweck können wir jedoch sql.NullInt64 und sql.NullString verwenden. Wenn diese Typen jedoch in eine Struktur eingebettet und mithilfe des JSON-Pakets in JSON konvertiert werden, weicht das resultierende Format von dem ab, das bei Verwendung der regulären Typen int64 und string erhalten wird.

Diese Ungleichheit entsteht, weil die JSON-Darstellung von sql.Null***-Typen umfassen eine zusätzliche Ebene, da diese Typen im Wesentlichen selbst Strukturen sind. Daher besteht die Notwendigkeit einer Problemumgehung, um das gewünschte JSON-Format zu erreichen.

Anstatt auf die Verwendung von NULL-Werten in der SQL-Datenbank zu verzichten, besteht eine praktikable Lösung darin, einen benutzerdefinierten Typ zu erstellen, der den JSON implementiert. Marshaller- und json.Unmarshaler-Schnittstellen. Durch die Einbettung des Typs sql.NullInt64 behalten wir die SQL-Methoden bei und gewinnen gleichzeitig die Kontrolle über die JSON-Verarbeitung. Hier ist ein Beispiel, das diesen Ansatz demonstriert:

type JsonNullInt64 struct {
    sql.NullInt64
}

func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
    if v.Valid {
        return json.Marshal(v.Int64)
    } else {
        return json.Marshal(nil)
    }
}

func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
    // Unmarshalling into a pointer will let us detect null
    var x *int64
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if x != nil {
        v.Valid = true
        v.Int64 = *x
    } else {
        v.Valid = false
    }
    return nil
}
Nach dem Login kopieren

Durch die Verwendung dieses benutzerdefinierten Typs anstelle von sql.NullInt64 wird die JSON-Darstellung an das gewünschte Format angepasst.

Um diese Lösung zu demonstrieren, können Sie Führen Sie den folgenden Code in einem Go-Playground aus:

func main() {
    type Person struct {
        Age     int64                `json:"age"`
        AgeJson JsonNullInt64        `json:"ageJson"`
    }
    p := Person{
        Age:     10,
        AgeJson: sql.NullInt64{Int64: 0, Valid: true},
    }
    b, _ := json.Marshal(p)
    fmt.Println(string(b))
}
Nach dem Login kopieren

Die Ausgabe ähnelt der Folgendes:

{"age":10,"ageJson":10}
Nach dem Login kopieren

Dieser Ansatz ermöglicht die nahtlose Verarbeitung von NULL-Werten sowohl in SQL als auch in JSON und sorgt so für eine konsistente Datendarstellung.

Das obige ist der detaillierte Inhalt vonWie kann man SQL-NULL-Werte und ihre JSON-Darstellung in Go effizient verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage