이 기사에서는 Go에서 SQL NULL 값 작업 시 발생하는 딜레마와 이를 처리하는 방법을 다룹니다. JSON 표현을 효과적으로.
int64, string 등 Go 유형을 활용하는 경우 null 값을 직접 저장할 수 없습니다. 그러나 이 목적으로 sql.NullInt64 및 sql.NullString을 사용할 수 있습니다. 그러나 이러한 유형이 구조체에 포함되어 json 패키지를 사용하여 JSON으로 변환되면 결과 형식은 일반 int64 및 문자열 유형을 사용할 때 얻은 형식과 다릅니다.
이러한 차이는 다음의 JSON 표현으로 인해 발생합니다. sql.Null*** 유형에는 기본적으로 구조체 자체이기 때문에 추가 수준이 포함됩니다. 결과적으로 원하는 JSON 형식을 얻기 위한 해결 방법이 필요합니다.
SQL 데이터베이스에서 NULL 값 사용을 포기하는 대신 실행 가능한 솔루션 중 하나는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!