Es ist schön, dass Go einen Dauer
Typ hat - durch explizit definierte Einheiten können reale Probleme vermieden werden.
Und aufgrund der strengen Typregeln von Go kannst du eine Dauer nicht mit einem Integer multiplizieren - du musst einen Cast verwenden, um gemeinsame Typen zu multiplizieren.
/*
MultiplyDuration Verberge semantisch ungültige Dauer-Mathematik hinter einer Funktion
*/
func MultiplyDuration(factor int64, dauer time.Duration) time.Duration {
return time.Duration(factor) * dauer // Methode 1 -- multipliziere in 'Dauer'
// return time.Duration(factor * int64(dauer)) // Methode 2 -- multipliziere in 'int64'
}
Die offizielle Dokumentation demonstriert die Verwendung von Methode #1:
Um eine ganze Anzahl von Einheiten in eine Dauer umzuwandeln, multipliziere:
sekunden := 10
fmt.Print(time.Duration(sekunden)*time.Second) // gibt 10s aus
Aber natürlich sollte die Multiplikation einer Dauer mit einer Dauer keine Dauer ergeben - das ist von vornherein unsinnig. Zum Beispiel ergibt 5 Millisekunden mal 5 Millisekunden 6h56m40s
. Der Versuch, 5 Sekunden zum Quadrat zu nehmen, führt zu einem Überlauf (und wird nicht einmal kompiliert, wenn er mit Konstanten gemacht wird).
Übrigens entspricht die int64
Repräsentation von Dauer
in Nanosekunden ungefähr "der größten darstellbaren Dauer von ungefähr 290 Jahren", was darauf hinweist, dass Dauer
, wie auch int64
, als vorzeichenbehafteter Wert behandelt wird: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
, und genau so ist es implementiert:
// Eine Dauer repräsentiert die verstrichene Zeit zwischen zwei Zeitpunkten
// als int64 Nanosekunden Zähler. Die Darstellung begrenzt die
// größte darstellbare Dauer auf ungefähr 290 Jahre.
type Dauer int64
Weil wir wissen, dass die zugrunde liegende Repräsentation von Dauer
ein int64
ist, ist das Durchführen des Casts zwischen int64
und Dauer
eine sinnvolle NO-OP - erforderlich nur um die Sprachregeln zum Mischen von Typen zu erfüllen, und es hat keinen Einfluss auf die anschließende Multiplikationsoperation.
Wenn dir das Casting aus Gründen der Reinheit nicht gefällt, vergrabe es in einem Funktionsaufruf, wie ich oben gezeigt habe.