Rumah > pembangunan bahagian belakang > Golang > Mengapa Membahagikan `masa.Tempoh` Go dengan Nombor Titik Terapung Kadangkala Gagal?

Mengapa Membahagikan `masa.Tempoh` Go dengan Nombor Titik Terapung Kadangkala Gagal?

Linda Hamilton
Lepaskan: 2024-12-10 02:57:10
asal
878 orang telah melayarinya

Why Does Dividing Go's `time.Duration` by a Floating-Point Number Sometimes Fail?

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)
Salin selepas log masuk

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)
Salin selepas log masuk

Dengan ralat:

invalid operation: time.Hour / d (mismatched types time.Duration and float64)
Salin selepas log masuk

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:

  1. Penukaran Eksplisit:
s := time.Hour / time.Duration(d)
Salin selepas log masuk
  1. Isytiharkan d sebagai masa. Tempoh:
d := time.Duration(73.0)
s := time.Hour / d
Salin selepas log masuk
  1. Gunakan jenis alias:
type Duration64 float64
d := Duration64(73.0)
s := time.Hour / time.Duration(d)
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan