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"}
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!