Tidur dengan Pecahan Tempoh Titik Terapung
Dalam Go, membahagikan tempoh masa dengan nilai titik terapung boleh membawa kepada tingkah laku yang tidak dijangka. Pertimbangkan contoh berikut:
s := time.Hour / 73.0 fmt.Println("sleeping: ", s) time.Sleep(s)
Kod ini berjaya mencetak tempoh "1m38s12ms" dan tidur atur cara untuk jumlah masa tersebut. Walau bagaimanapun, kod ini gagal:
d := 73.0 s := time.Hour / d fmt.Println("sleeping: ", s) time.Sleep(s)
Dengan ralat:
invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Mengapa kedua-dua kod ini berkelakuan berbeza?
Sistem Jenis dan Penukaran Malar
Dalam kod pertama, pemalar 73.0 ialah pemalar berangka yang tidak ditaip. Apabila digunakan dalam ungkapan, Go secara automatik menukarnya kepada jenis yang sesuai berdasarkan konteks. Dalam kes ini, masa.Jam ialah masa jenis.Tempoh, jadi 73.0 ditukar kepada masa.Tempoh.
Walau bagaimanapun, dalam kod kedua, d diisytiharkan secara eksplisit sebagai jenis float64. Apabila membahagikan masa.Jam dengan d, Pergi cuba melakukan pembahagian antara masa.Tempoh dan apungan64, yang tidak dibenarkan.
Menukar kepada masa.Tempoh
Untuk membuat kerja kod kedua, d mesti ditukar kepada masa. Tempoh. Terdapat beberapa cara untuk mencapai ini:
s := time.Hour / time.Duration(d)
d := time.Duration(73.0) s := time.Hour / d
type Duration64 float64 d := Duration64(73.0) s := time.Hour / time.Duration(d)
Apabila menukar nilai titik terapung kepada masa. Tempoh, ketepatan mungkin hilang jika nilai tidak boleh diwakili dengan int64. Dalam kes ini, penukaran dalam arah songsang mungkin diperlukan:
s := time.Duration(float64(time.Hour) / d)
Atas ialah kandungan terperinci Mengapa Membahagikan `masa.Tempoh` Go dengan Nombor Titik Terapung Kadangkala Gagal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!