Maison >développement back-end >Golang >Comment conserver les zéros de fin lors du marshaling des flotteurs dans Go JSON ?

Comment conserver les zéros de fin lors du marshaling des flotteurs dans Go JSON ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 06:12:10934parcourir

How to Preserve Trailing Zeros When Marshaling Floats in Go JSON?

Conserver les zéros de fin dans les nombres à virgule flottante marshalés JSON

Dans Go, la fonction json.Marshal() supprime souvent les zéros de fin du flottant -numéros de points lors du triage. Cela peut entraîner une perte de précision dans certains scénarios.

Problème :

Lors du regroupement de la valeur d'un programme Go avec un zéro final (par exemple, 40,0), json.Marshal () affiche la valeur sans le zéro (par exemple, 40). Ce comportement peut être problématique si des programmes externes attendent des nombres à virgule flottante avec des zéros à droite.

Solution 1 (recommandée) : utiliser un type flottant personnalisé

Définir un flottant personnalisé tapez et implémentez la méthode MarshalJSON() pour contrôler la sérialisation JSON. Voici un exemple :

type KeepZero float64

func (f KeepZero) MarshalJSON() ([]byte, error) {
    if float64(f) == float64(int(f)) {
        return []byte(strconv.FormatFloat(float64(f), 'f', 1, 32)), nil
    }
    return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil
}

Dans ce type personnalisé, la méthode MarshalJSON() convertit le float en une chaîne avec une décimale (s'il s'agit d'un nombre entier) ou conserve toutes les décimales (s'il ne s'agit pas d'un nombre entier). nombre entier).

Exemple :

type Pt struct {
    Value KeepZero
    Unit  string
}

func main() {
    data, err := json.Marshal(Pt{Value: 40.0, Unit: "some_string"})
    fmt.Println(string(data), err)
}

Ce code génère {"Value":40.0,"Unit":"some_string"} , en préservant le zéro final dans la sortie JSON.

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