浮動小数点期間の小数部を使用したスリープ
Go では、期間を浮動小数点値で除算すると、予期しない動作が発生する可能性があります。次の例を考えてみましょう。
s := time.Hour / 73.0 fmt.Println("sleeping: ", s) time.Sleep(s)
このコードは、継続時間「1m38s12ms」を正常に出力し、その時間だけプログラムをスリープさせます。ただし、このコードは失敗します:
d := 73.0 s := time.Hour / d fmt.Println("sleeping: ", s) time.Sleep(s)
エラー:
invalid operation: time.Hour / d (mismatched types time.Duration and float64)
これら 2 つのコードの動作が異なるのはなぜですか?
型システムと定数の変換
最初のコードでは、定数 73.0 は型なしの数値定数。式で使用すると、Go はコンテキストに基づいて適切な型に自動的に変換します。この場合、time.Hour は time.Duration 型であるため、73.0 は time.Duration.
に変換されます。ただし、2 番目のコードでは、d は明示的に float64 型として宣言されています。 time.Hour を d で除算する場合、Go は time.Duration と float64 の間で除算を実行しようとしますが、これは許可されていません。
time.Duration
に変換します2 番目のコードでは、d を time.Duration に変換する必要があります。これを実現するにはいくつかの方法があります。
s := time.Hour / time.Duration(d)
d := time.Duration(73.0) s := time.Hour / d
type Duration64 float64 d := Duration64(73.0) s := time.Hour / time.Duration(d)
浮動小数点値を time.Duration に変換する場合、値が int64 で表現できない場合、精度が失われる可能性があります。このような場合、逆方向の変換が必要になる場合があります:
s := time.Duration(float64(time.Hour) / d)
以上がGo の「time.Duration」を浮動小数点数で除算すると失敗することがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。