507 Stimmen

Wie multipliziere ich die Dauer mit einer Ganzzahl?

Um gleichzeitig laufende Goroutinen zu testen, habe ich einer Funktion eine Zeile hinzugefügt, die zufällige Zeit benötigt, um zurückzukehren (bis zu einer Sekunde)

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

Aber als ich kompilierte, bekam 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?

2voto

Inanc Gumus Punkte 20769

Multiplizieren Sie es einfach wie folgt:

time.Sleep(1000 * time.Millisecond)

Sie müssen es nicht konvertieren.


Begründung:

1000 ist eine ungetypte literale Konstante mit einem Standardtyp von Integer, es hat einen idealen Typen.

1000 * time.Millisecond kann direkt verwendet werden, weil Go die ungetypten Konstanten automatisch in numerische Typen umwandelt. Hier wandelt es 1000 automatisch in time.Duration um, weil es ein Alias für Int64 ist.

Millisekunde so definiert:

type Duration int64

const (
    Nanosekunde  Duration = 1
    Mikrosekunde          = 1000 * Nanosekunde
    Millisekunde          = 1000 * Mikrosekunde
    Sekunde               = 1000 * Millisekunde
    Minute               = 60 * Sekunde
    Stunde                 = 60 * Minute
)

Millisekunde hat den Typ time.Duration, aber im Untergrund ist es ein int64, der zuweisbar ist und von einem numerischen ungetypten Integer verwendet werden kann.


Ich habe über diese Details hier in diesem Beitrag geschrieben.

Go Default Types Cheatsheet

0voto

latitov Punkte 382

Mein Zug:

https://play.golang.org/p/RifHKsX7Puh

package main

import (
    "fmt"
    "time"
)

func main() {
    var n int = 77
    v := time.Duration( 1.15 * float64(n) ) * time.Second

    fmt.Printf("%v %T", v, v)
}

Es hilft, sich daran zu erinnern, dass time.Duration im Grunde nur ein int64 ist, der einen Nanosekundenwert speichert.

Auf diese Weise wird die Konvertierung zu/von time.Duration zu einer Formalität. Denken Sie einfach daran:

  • int64
  • immer Nanosekunden

0voto

Amaimersion Punkte 627

Sie können time.ParseDuration verwenden.

ms := rand.Int31n(1000)
dauer, fehler := time.ParseDuration(fmt.Sprintf(
    "%vms",
    ms,
))

-4voto

delroy.santos Punkte 1

Zur Multiplikation der Variable mit time.Second wird folgender Code verwendet:

    oneHr:=3600
    addOneHrDuration :=time.Duration(oneHr)
    addOneHrCurrTime := time.Now().Add(addOneHrDuration*time.Second)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X