In Go können Sie Variablen des gleichen Typs multiplizieren, daher müssen beide Teile des Ausdrucks den gleichen Typ haben.
Die einfachste Sache, die Sie tun können, besteht darin, eine Ganzzahl vor der Multiplikation auf Dauer zu transformieren, aber das würde die Einheitensemantik verletzen. Was wäre die Multiplikation von Dauer und Dauer in Einheiten?
Ich würde eher konvertieren time.Millisecond zu einem int64, und dann durch die Anzahl der Millisekunden multiplizieren, dann werfen zu time.Duration:
time.Duration(int64(time.Millisecond) * int64(rand.Int31n(1000)))
diese Weise ein Teil des Ausdrucks gesagt werden kann, um einen sinnvollen Wert nach seinem Typ zu haben. int64(time.Millisecond)
Teil ist nur ein dimensionsloser Wert - die Anzahl der kleinsten Zeiteinheiten im ursprünglichen Wert.
Wenn gehen einen etwas einfacheren Weg:
time.Duration(rand.Int31n(1000)) * time.Millisecond
Der linke Teil der Multiplikation ist Unsinn - ein Wert vom Typ "time.Duration", etwas irrelevant seiner Art hält:
numberOfMilliseconds := 100
// just can't come up with a name for following:
someLHS := time.Duration(numberOfMilliseconds)
fmt.Println(someLHS)
fmt.Println(someLHS*time.Millisecond)
Und es ist nicht nur Semantik, es gibt tatsächliche Funktionalität mit Typen verbunden. Dieser Code druckt:
100ns
100ms
Interessanterweise hier das Codebeispiel verwendet den einfachstenen Code, mit der gleichen irreführenden Semantik von Dauer-Konvertierung: https://golang.org/pkg/time/#Duration
Seconds: = 10
fmt.Print (time.Duration (Sekunden) * time.Second) // druckt 10s
Dank, das funktioniert. Ich habe auch gelernt, über den Zufallszahlengenerator Impfen 'rand.Seed (time.Now(). Unix())' –
nur für mein Wissen, wie funktioniert die folgende Arbeit dann? 'time.sleep (time.Second * 2)' –
Es funktioniert, weil Konstanten einen adaptiven Typ haben, je nachdem, wie sie verwendet werden. Sehen Sie diesen Blog-Beitrag von Rob Pike, der es im Detail erklärt: http://blog.golang.org/constants – mna