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
Linda Hamiltonasal
2024-12-10 02:57:10949semak imbas

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)

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:

  1. Penukaran Eksplisit:
s := time.Hour / time.Duration(d)
  1. Isytiharkan d sebagai masa. Tempoh:
d := time.Duration(73.0)
s := time.Hour / d
  1. Gunakan jenis alias:
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!

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