ホームページ  >  記事  >  バックエンド開発  >  Go で遅延関数の実行時間を測定すると予期しない結果が返されるのはなぜですか?

Go で遅延関数の実行時間を測定すると予期しない結果が返されるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-20 11:47:51814ブラウズ

Why Does Measuring Deferred Function Execution Time in Go Return Unexpected Results?

Go の遅延関数を使用した関数の実行時間の測定

Go では、遅延関数は、関数の実行を遅延する便利なメカニズムを提供します。周囲の関数が戻ります。ただし、遅延関数の実行にかかった時間を出力すると、予期しない結果が返されることがあります。

問題:

実行時間を計算しようとする次の sum() 関数を考えてみましょう。遅延関数の使用:

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 が出力されます。 time.

解決策:

この問題は、遅延関数の引数が関数の実行時ではなく遅延時に評価されるために発生します。これを修正するには、匿名関数を使用して start の現在値を取得し、その匿名関数の実行を延期します。

defer func() { fmt.Println(time.Now().Sub(start)) }()

匿名関数を使用すると、start の値は遅延された時点で評価されます。関数が実行されます。

さらなる考慮事項:

さらにカスタマイズが必要な場合、または柔軟性を考慮して、タイミング ロジックを再利用可能な関数にカプセル化することを検討してください。このアプローチは、よりモジュール化された再利用可能なソリューションを提供します。

以上がGo で遅延関数の実行時間を測定すると予期しない結果が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。