この記事では、Go で SQL NULL 値を操作する際のジレンマと、その処理方法について説明します。 JSON 表現を効果的に表現します。
int64 や string などの Go 型を利用する場合、null 値を直接指定することはできません。保管されています。ただし、この目的のために sql.NullInt64 および sql.NullString を使用できます。ただし、これらの型が構造体に埋め込まれ、json パッケージを使用して JSON に変換されると、結果の形式は、通常の int64 および string 型を使用したときに得られる形式とは異なります。
この相違は、次の JSON 表現が原因で発生します。 sql.Null*** 型には、本質的に構造体そのものであるため、追加のレベルが含まれています。その結果、目的の JSON 形式を実現するための回避策が必要になります。
SQL データベースでの NULL 値の使用を放棄する代わりに、実行可能な解決策の 1 つは、JSON を実装するカスタム タイプを作成することです。 Marshaller インターフェイスと json.Unmarshaler インターフェイス。 sql.NullInt64 型を埋め込むことで、JSON 処理を制御しながら SQL メソッドを保持します。このアプローチを示す例は次のとおりです。
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 プレイグラウンドで次のコードを実行します。
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 中国語 Web サイトの他の関連記事を参照してください。