2013-07-10 15 views
119

Aby przetestować jednoczesnych goroutines dodałem linię do funkcji, aby to zrobić losowy czas powrotu (do jednej sekundy)Jak pomnożyć czas przez liczbę całkowitą?

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

jednak kiedy skompilowane, mam ten błąd

\ crawler.go. 49: nieprawidłowe działanie: rand.Int31n (1000) * time.Millisecond (niedopasowane rodzaje Int32 i time.Duration)

Jakieś pomysły? Jak mogę pomnożyć czas trwania?

Odpowiedz

175

int32 i time.Duration to różne typy. Konwertuj numer int32 na time.Duration, na przykład time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond).

+3

Dzięki, że zadziałało. Dowiedziałem się także o zaszczepieniu generatora liczb losowych 'rand.Seed (time.Now(). Unix())' –

+11

tylko dla mojej wiedzy, jak działa wtedy następująca czynność? 'time.Sleep (time.Second * 2)' –

+23

Działa, ponieważ stałe mają typ adaptacyjny, w zależności od sposobu ich użycia. Zobacz ten wpis na blogu Rob Pike, który wyjaśnia to szczegółowo: http://blog.golang.org/constants – mna

18

Trzeba oddać go do właściwego formatu Playground.

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

Jeśli będzie sprawdzić dokumentację sleep, widać, że wymaga func Sleep(d Duration) czas jako parametr. Twoja rand.Int31n zwraca .

Linia z przykładu działa (time.Sleep(100 * time.Millisecond)), ponieważ kompilator jest wystarczająco inteligentny, aby zrozumieć, że tutaj Twój constant 100 oznacza czas trwania. Ale jeśli przekazujesz zmienną, powinieneś ją rzucić.

0

W programie Go można pomnożyć zmienne tego samego typu, więc oba elementy wyrażenia muszą być tego samego typu.

Najprostszą rzeczą, jaką można zrobić, to rzutowanie liczby całkowitej na czas trwania przed pomnożeniem, ale to naruszałoby semantykę jednostki. Co byłoby mnożeniem czasu trwania przez czas trwania w jednostkach?

wolałbym konwertować time.Millisecond do Int64, a następnie pomnożyć przez liczbę milisekund, a następnie oddane do time.Duration:

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

ten sposób jakakolwiek część wyrazu można powiedzieć mieć znaczącą wartość w zależności od jej typu. int64(time.Millisecond) część jest po prostu wartością bezwymiarową - liczbą najmniejszych jednostek czasu w pierwotnej wartości.

Jeśli chodzić nieco prostszą ścieżkę:

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

Lewa część mnożenia jest nonsens - wartość typu „time.Duration”, trzymając coś bez znaczenia dla jego typu:

numberOfMilliseconds := 100 
// just can't come up with a name for following: 
someLHS := time.Duration(numberOfMilliseconds) 
fmt.Println(someLHS) 
fmt.Println(someLHS*time.Millisecond) 

I nie jest to tylko semantyka, nie ma faktycznej funkcjonalności związanej z typami. Ten kod drukuje:

100ns 
100ms 

ciekawe, kod próbki tutaj używa najprostszy kodu z tych samych błędnych semantyki przekształcenia czas trwania: https://golang.org/pkg/time/#Duration

sekund: = 10

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

Powiązane problemy