時間の一部によるスリープ
Go では、時間の一部の睡眠を時間を使用して実現できます。 () 関数。引数として time.Duration を取ります。ただし、期間の一部を指定しようとすると、コード構造に基づいて異なる動作が発生する可能性があります。
次の 2 つのシナリオを考えてみましょう:
// Case 1: Works s := time.Hour / 73.0 fmt.Println("sleeping: ", s) time.Sleep(s) // Case 2: Fails d := 73.0 s := time.Hour / d fmt.Println("sleeping: ", s) time.Sleep(s) // Error: time.Hour / d (mismatched types time.Duration and float64)
ケース 1 では、コードは正常に実行されました。スリープ時間は 1 時間未満ですが、ケース 2 では、型の不一致エラーで失敗します。その理由を理解するには、Go で定数と型がどのように処理されるかを理解することが重要です。
定数式を理解する
Go では、定数は厳密に型指定されており、型指定されていない場合もあります。 (デフォルトの型を使用)、または明示的に型指定されています。
ケース 1 では、time.Hour は型付き定数です。タイプ time.Duration の。 time.Hour を 73.0 で除算すると、Go は型なし定数 73.0 を time.Duration に自動的に変換し、式 time.Hour / time.Duration(73.0).
型と不一致の型の推論
ケース 2 では、d は初期化された型なし定数です73.0でした。型が必要であるため、Go は定数値に基づいて型を推論し、その結果 d は float64 になります。
その後、time.Hour を d で除算しようとすると、現在の型は float64 であることが Go によって検出されます。型の不一致。 Go では time.Duration と float64 の除算は許可されていません。
型の不一致を解決する
型の不一致を解決するには、d を明示的に time.Duration に変換できます。除算を実行する前に:
s := time.Hour / time.Duration(d)
あるいは、d を a として直接定義することもできます。 time.Duration 変数:
d := time.Duration(73.0) s = time.Hour / d
または、変数宣言で型変換を使用します:
var d time.Duration = 73.0 s = time.Hour / d
time.Duration
で表現できない値の処理除算結果が time.Duration で表現できない場合 (例: 時間を で割る) 73.5)、time.Hour を float64 に変換し、除算を実行して、結果を time.Duration:
d := 73.5 s := time.Duration(float64(time.Hour) / d)
に変換します。型変換ルールを理解し、必要に応じて変換を明示的に処理することで、正常に変換できます。 Go の時間のほんの一部だけスリープします。
以上がGo で時間の一部を正しく睡眠する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。