在本文中,我們解決了在Go 中使用SQL NULL 值的困境以及如何處理它們有效的JSON 表示。
使用 Go 類型(例如 int64 和 string)時,無法直接儲存 null 值。但是,我們可以使用 sql.NullInt64 和 sql.NullString 來實現此目的。然而,當這些類型嵌入到結構體中並使用 json 套件轉換為 JSON 時,產生的格式與使用常規 int64 和 string 類型時獲得的格式不同。
出現這種差異是因為 JSON 表示sql.Null*** 類型包括一個附加級別,因為這些類型本質上是結構本身。因此,需要一種解決方法來實現所需的 JSON 格式。
與其放棄在 SQL 資料庫中使用 NULL 值,一個可行的解決方案是建立一個實作 json 的自訂類型。 Marshaller 和 json.Unmarshaler 介面。透過嵌入 sql.NullInt64 類型,我們保留了 SQL 方法,同時獲得了對 JSON 處理的控制。以下是示範此方法的範例:
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 }
透過使用此自訂類型取代 sql.NullInt64,JSON 表示形式與所需的格式一致。
要示範此解決方案,您可以在Go Playground 中執行以下程式碼:
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)) }
輸出將類似於以下程式碼:
{"age":10,"ageJson":10}
這種方法允許無縫處理SQL 和JSON 中的NULL 值,保持資料表示的一致性。
以上是如何在 Go 中高效處理 SQL NULL 值及其 JSON 表示?的詳細內容。更多資訊請關注PHP中文網其他相關文章!