Go'nun bir Durationtürü olması güzeldir - açıkça tanımlanmış birimlere sahip olmak gerçek dünya sorunlarını önleyebilir.
Ve Go sıkı tip kuralları, çünkü olamaz çarpın bir tamsayı tarafından Süresi - Eğer gerekir çarpma yaygın türleri için bir döküm kullanın.
/*
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'
}
Resmi belgeler yöntemi 1. kullanılarak gösterir:
Tam sayı bir birimi bir Süreye dönüştürmek için çarpın:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Ancak, elbette, bir süreyi bir süreyle çarpmak bir süre üretmemelidir - bu, yüzünde saçmadır. Durumda, 5 milisaniye çarpı 5 milisaniye üretir 6h56m40s. 5 saniye kare denemeye çalışmak taşmaya neden olur (ve sabitlerle yapılırsa bile derlenmez).
Bu arada, int64temsili Durationnanosaniye "Yaklaşık 290 yıl gösterilebilir en büyük süresini sınırlar" ve bu belirtir Duration, böyle int64imzalı bir değer olarak ele alınır: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292ve bu böyle uygulanır aynen böyle:
// 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
Bu nedenle, bunun temel temsilinin Durationan olduğunu int64, aradaki dökümün gerçekleştirilmesi int64ve Durationmantıklı bir NO-OP olduğunu biliyoruz - sadece karıştırma türleri ile ilgili dil kurallarını karşılamak için gerekli ve sonraki çarpma işlemi üzerinde hiçbir etkisi yoktur.
Saflık nedeniyle dökümden hoşlanmıyorsanız, yukarıda gösterdiğim gibi bir işlev çağrısına gömün.
rand.Seed(time.Now().Unix())