ホームページ > バックエンド開発 > Golang > Go の「time.Duration」を浮動小数点数で除算すると失敗することがあるのはなぜですか?

Go の「time.Duration」を浮動小数点数で除算すると失敗することがあるのはなぜですか?

Linda Hamilton
リリース: 2024-12-10 02:57:10
オリジナル
879 人が閲覧しました

Why Does Dividing Go's `time.Duration` by a Floating-Point Number Sometimes Fail?

浮動小数点期間の小数部を使用したスリープ

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 に変換する必要があります。これを実現するにはいくつかの方法があります。

  1. 明示的な変換:
s := time.Hour / time.Duration(d)
ログイン後にコピー
  1. 時間として宣言します。期間:
d := time.Duration(73.0)
s := time.Hour / d
ログイン後にコピー
  1. タイプを使用するalias:
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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート