Go では、defer ステートメントを使用して、周囲の関数が戻るまで関数の実行を延期できます。ただし、defer を使用して関数の実行時間を出力しようとすると、0 が返されることがあります。この動作とその解決策を調べてみましょう。
次のコード スニペットを考えてみましょう:
func sum() { start := time.Now() //expecting to print non zero value but always gets 0 defer fmt.Println(time.Now().Sub(start)) sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
少しスリープした後でも、時差計算を延期すると常に 0 が出力されます。これはなぜですか?
この問題は、遅延関数の引数が関数が遅延された時点で評価されるために発生します。遅延関数が実行されるまでに、周囲の関数はすでに返されており、start 変数はスコープ外になります。
これを修正するには、start の現在値をキャプチャするクロージャーを作成します。修正されたコードは次のとおりです。
func sum() { start := time.Now() // Create a closure that captures the current value of start defer func() { fmt.Println(time.Now().Sub(start)) }() sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
タイミング ロジックを別の関数にカプセル化すると、コードの再利用性も向上します。
以上がGo で関数の実行時間を測定しようとすると、時間差の計算を延期すると 0 が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。