首頁 > 後端開發 > Golang > 如何在 Go 中高效處理 SQL NULL 值及其 JSON 表示?

如何在 Go 中高效處理 SQL NULL 值及其 JSON 表示?

Mary-Kate Olsen
發布: 2025-01-03 06:22:39
原創
265 人瀏覽過

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

高效地使用SQL NULL 值和JSON

在本文中,我們解決了在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板