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 }
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)) }
Die Ausgabe ähnelt der Folgendes:
{"age":10,"ageJson":10}
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!