it-swarm.com.de

Wie multipliziert man die Dauer mit einer ganzen Zahl?

Um gleichzeitige Goroutinen zu testen, habe ich einer Funktion eine Linie hinzugefügt, damit die Rückkehr eine zufällige Zeit in Anspruch nimmt (bis zu einer Sekunde).

time.Sleep(Rand.Int31n(1000) * time.Millisecond)

Jedoch als ich kompilierte, erhielt ich diesen Fehler

.\crawler.go: 49: ungültige Operation: Rand.Int31n (1000) * time.Millisecond (nicht übereinstimmende Typen int32 und time.Duration)

Irgendwelche Ideen? Wie kann ich eine Dauer multiplizieren?

216
Colonel Panic

int32 Und time.Duration Sind verschiedene Typen. Sie müssen den int32 In einen time.Duration Konvertieren, z. B. time.Sleep(time.Duration(Rand.Int31n(1000)) * time.Millisecond).

326
mna

Sie müssen es in ein korrektes Format umwandeln Playground.

yourTime := Rand.Int31n(1000)
time.Sleep(time.Duration(yourTime) * time.Millisecond)

Wenn Sie die Dokumentation auf sleep prüfen, sehen Sie, dass func Sleep(d Duration) duration als Parameter erforderlich ist. Ihr Rand.Int31n gibt int32 Zurück.

Die Zeile aus dem Beispiel funktioniert (time.Sleep(100 * time.Millisecond)), weil der Compiler klug genug ist zu verstehen, dass hier Ihre Konstante 100 eine Dauer bedeutet. Wenn Sie jedoch eine Variable übergeben, sollten Sie diese umwandeln.

42
Salvador Dali

In Go können Sie Variablen desselben Typs multiplizieren, sodass beide Teile des Ausdrucks denselben Typ haben müssen.

Das Einfachste, was Sie tun können, ist, vor dem Multiplizieren eine Ganzzahl auf die Dauer zu setzen. Dies würde jedoch die Einheitensemantik verletzen. Was wäre die Multiplikation der Dauer mit der Dauer in Einheiten?

Ich würde lieber time.Millisecond in int64 konvertieren und es dann mit der Anzahl der Millisekunden multiplizieren und dann in time.Duration umwandeln:

time.Duration(int64(time.Millisecond) * int64(Rand.Int31n(1000)))

Auf diese Weise kann gesagt werden, dass jeder Teil des Ausdrucks je nach Typ einen aussagekräftigen Wert hat. int64(time.Millisecond) part ist nur ein dimensionsloser Wert - die Anzahl der kleinsten Zeiteinheiten im ursprünglichen Wert.

Wenn Sie einen etwas einfacheren Weg gehen:

time.Duration(Rand.Int31n(1000)) * time.Millisecond

Der linke Teil der Multiplikation ist Unsinn - ein Wert vom Typ "time.Duration", der etwas enthält, das für den Typ irrelevant ist:

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 Funktionen, die mit Typen verbunden sind. Dieser Code druckt:

100ns
100ms

Interessanterweise verwendet das Codebeispiel hier den einfachsten Code mit derselben irreführenden Semantik der Duration-Konvertierung: https://golang.org/pkg/time/#Duration

sekunden: = 10

fmt.Print (time.Duration (seconds) * time.Second) // druckt 10s

10
George Polevoy