Maison >développement back-end >Golang >Comment gérer efficacement les valeurs SQL NULL et JSON dans Go ?

Comment gérer efficacement les valeurs SQL NULL et JSON dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 07:16:17571parcourir

How to Handle SQL NULL Values and JSON Effectively in Go?

Travailler avec des valeurs SQL NULL et JSON dans Go

Lorsque vous travaillez avec des valeurs nullables dans Go, il est courant d'utiliser des types comme sql.NullInt64 et sql.NullString. Cependant, ces types peuvent conduire à des résultats inattendus lors de la génération de JSON à partir d'une structure qui les contient. Plus précisément, la sortie JSON peut inclure un niveau supplémentaire car sql.Null*** est également une structure.

Solution de contournement

Pour résoudre ce problème, une solution de contournement consiste à créez un type personnalisé qui implémente les interfaces json.Marshaller et json.Unmarshaler. En intégrant le type sql.NullInt64, vous pouvez gérer de manière transparente les méthodes SQL tout en définissant votre propre comportement de marshaling et de démarshaling JSON.

Voici un exemple :

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
}

Lorsque vous utilisez ce type personnalisé au lieu de sql.NullInt64, la sortie JSON sera au format attendu, sans les éléments supplémentaires niveau.

Exemple

Vous pouvez tester cet exemple sur le lien suivant :

http://play.golang.org/p/zFESxLcd -c

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn