Go'nun bir Duration
tü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, int64
temsili Duration
nanosaniye "Yaklaşık 290 yıl gösterilebilir en büyük süresini sınırlar" ve bu belirtir Duration
, böyle int64
imzalı bir değer olarak ele alınır: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
ve 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 Duration
an olduğunu int64
, aradaki dökümün gerçekleştirilmesi int64
ve Duration
mantı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())