2013-07-10 7 views
119

は私がコンパイルしたとき、それはしかし、期間を整数で掛ける方法は?

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

(最大1秒に)戻るには、ランダムな時間がかかる作るための関数に行を追加して、同時ゴルーチンをテストするために、私はこのエラーを得た

\ crawler.go:49:無効な操作:rand.Int31n(1000)* time.Millisecond(不一致の型がINT32とtime.Duration)

任意のアイデア?期間をどのように増やすことができますか?

答えて

175

int32およびtime.Durationは異なるタイプです。 int32time.Durationtime.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)など)に変換する必要があります。

+3

ありがとうございました。私は乱数ジェネレータ 'rand.Seed(time.Now()。Unix())' –

+11

を播種することについても学びました。 'time.Sleep(time.Second * 2)' –

+23

これは、定数の使用方法に基づいて定数が適応型であるために機能します。 Rob Pikeのブログ記事を詳しく説明しています:http://blog.golang.org/constants – mna

18

正しい形式にキャストする必要があります。Playground

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

あなたがsleepのドキュメントをチェックする場合、あなたはそれがパラメータとしてfunc Sleep(d Duration)期間が必要であることを参照してください。 rand.Int31nint32を返します。

この例の行は、コンパイラがここであなたのconstantが100であることを理解するのに十分なほどスマートなので、(time.Sleep(100 * time.Millisecond))の行が続きます。しかし、変数を渡す場合は、それをキャストする必要があります。

0

Goでは、同じタイプの変数を掛けることができるため、同じタイプの式の両方の部分を持つ必要があります。

最も単純なことは、乗算する前に整数を期間にキャストすることですが、これはユニットのセマンティクスに違反します。ユニットの期間内の継続時間の継続時間の倍数は何ですか?

私はむしろint64型にtime.Millisecondを変換し、ミリ秒数を掛け、その後、time.Durationにキャストしたい

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

こう表現のどの部分を言うことができますその種類に応じて有意義な価値を持つこと。 int64(time.Millisecond)部分は、無次元の値です - 元の値の時間の最小単位の数。

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

:その種類とは無関係なものを保持しているタイプの値「time.Duration」、 -

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

乗算の左側の部分はナンセンスです:

少しシンプルな道を歩むならばそして意味だけでなく、タイプに関連する実際の機能もあります。 このコードを印刷:

100ns 
100ms 

興味深いことに、コードサンプルはこちら期間変換の同じ誤解を招くようなセマンティクスで、最も簡単なコードを使用しています:https://golang.org/pkg/time/#Duration

秒:= 10

fmt.Print (時間の長さ(秒)*時間秒)//プリント10秒

関連する問題