Defer ステートメントは、関数の完了を待ってから、関連する関数を実行します。ただし、defer を使用して次の関数の実行時間を出力すると、常にゼロが返されます:
func sum() { start := time.Now() // Expected 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) }
問題:
defer は、含まれる関数が遅延関数の引数を延期するときに、遅延関数の引数を評価します。 。したがって、start はループまたはスリープの前にすぐに評価されます。
解決策:
経過時間を正確に測定するには、遅延関数内で time.Now() を評価します。
defer func() { fmt.Println(time.Now().Sub(start)) }()
これにより、遅延関数の実行時に時差が計算され、正確な時刻が保証されます。
ヒント: より簡単かつ一貫した測定を行うために、再利用可能な関数を使用してタイミング ロジックをカプセル化することを検討してください。
以上がGo で Defer を使用して実行時間を測定すると、常にゼロが得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。