Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Sifar Mengekori Apabila Marshaling Terapung dalam Go JSON?

Bagaimana untuk Mengekalkan Sifar Mengekori Apabila Marshaling Terapung dalam Go JSON?

Linda Hamilton
Linda Hamiltonasal
2024-11-24 06:12:10931semak imbas

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

Kekalkan Sifar Mengekor dalam Nombor Titik Terapung Terpelihara JSON

Dalam Go, fungsi json.Marshal() sering menanggalkan sifar tertinggal daripada terapung -nombor mata semasa marshalling. Ini boleh menyebabkan kehilangan ketepatan dalam senario tertentu.

Masalah:

Apabila menyusun nilai program Go dengan sifar tertinggal (cth., 40.0), json.Marshal () mengeluarkan nilai tanpa sifar (mis., 40). Tingkah laku ini boleh menjadi masalah jika program luaran menjangkakan nombor titik terapung dengan sifar mengekori.

Penyelesaian 1 (Disyorkan): Gunakan Jenis Terapung Tersuai

Tentukan terapung tersuai taip dan laksanakan kaedah MarshalJSON() untuk mengawal siri JSON. Berikut ialah contoh:

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
}

Dalam jenis tersuai ini, kaedah MarshalJSON() menukarkan apungan kepada rentetan dengan satu tempat perpuluhan (jika ia nombor bulat) atau mengekalkan semua tempat perpuluhan (jika ia bukan nombor bulat).

Contoh:

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)
}

Kod ini output {"Value":40.0,"Unit":"some_string"} , mengekalkan sifar di belakang dalam output JSON.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Sifar Mengekori Apabila Marshaling Terapung dalam Go JSON?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn