Sangat menyenangkan bahwa Go memiliki Duration
tipe - memiliki unit yang didefinisikan secara eksplisit dapat mencegah masalah dunia nyata.
Dan karena aturan tipe Go yang ketat, Anda tidak bisa mengalikan Durasi dengan bilangan bulat - Anda harus menggunakan gips untuk mengalikan tipe umum.
/*
MultiplyDuration Hide semantically invalid duration math behind a function
*/
func MultiplyDuration(factor int64, d time.Duration) time.Duration {
return time.Duration(factor) * d // method 1 -- multiply in 'Duration'
// return time.Duration(factor * int64(d)) // method 2 -- multiply in 'int64'
}
The dokumentasi resmi menunjukkan menggunakan metode # 1:
Untuk mengonversi jumlah integer unit ke Durasi, kalikan:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Tapi, tentu saja, mengalikan durasi dengan durasi seharusnya tidak menghasilkan durasi - itu tidak masuk akal di wajah itu. Contoh kasus, 5 milidetik kali 5 milidetik menghasilkan 6h56m40s
. Mencoba persegi 5 detik menghasilkan limpahan (dan bahkan tidak akan dikompilasi jika dilakukan dengan konstanta)
Omong-omong, int64
representasi Duration
dalam nanodetik "membatasi durasi terwakili terbesar hingga sekitar 290 tahun" , dan ini menunjukkan bahwa Duration
, seperti int64
, diperlakukan sebagai nilai yang ditandatangani:, (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
dan itulah cara penerapannya:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64
Jadi, karena kita tahu bahwa representasi yang mendasarinya Duration
adalah int64
, melakukan pemeran di antara int64
dan Duration
merupakan NO-OP yang masuk akal - hanya diperlukan untuk memenuhi aturan bahasa tentang jenis pencampuran, dan itu tidak berpengaruh pada operasi penggandaan selanjutnya.
Jika Anda tidak suka casting karena alasan kemurnian, kubur dalam panggilan fungsi seperti yang saya tunjukkan di atas.
rand.Seed(time.Now().Unix())