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
Dzięki, że zadziałało. Dowiedziałem się także o zaszczepieniu generatora liczb losowych 'rand.Seed (time.Now(). Unix())' –
tylko dla mojej wiedzy, jak działa wtedy następująca czynność? 'time.Sleep (time.Second * 2)' –
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