ホームページ >バックエンド開発 >Golang >Go で遅延ステートメントが予想されるチケット価格を生成しないのはなぜですか?

Go で遅延ステートメントが予想されるチケット価格を生成しないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 18:30:18379ブラウズ

Why Does My Defer Statement Not Produce the Expected Ticket Price in Go?

Go での defer キーワードの仕組み

Go では、defer キーワードを使用すると、周囲の関数またはステートメントの実行を遅らせることができます。関数が戻ります。ただし、遅延関数の値とパラメーターはすぐに評価され、defer ステートメントの時点で関数呼び出しにバインドされます。

遅延評価順序について

たとえば、次のコード:

defer fmt.Println("Your age is:", getAge(age))

関数 fmt.Println の実行を延期し、defer ステートメントの時点で age の値をバインドします。ただし、実際の fmt.Println 関数呼び出しは、周囲の関数が戻る直前に逆の順序で実行されます。

チケット価格計算でのアプリケーション

あなたの場合、ユーザーの年齢に基づいてチケット価格を計算したいとします。

defer fmt.Println("Your ticket price is:", printTicket(age, ticketPrice))

ここで、defer ステートメントは、defer ステートメントの時点での年齢と ticketPrice の値をバインドします。 main 関数が戻ると、age と ticketPrice のバインドされた値を使用して printTicket が呼び出されます。ただし、年齢

問題の解決

問題を解決するには、次のことを確認してください。 printTicket 内のすべての必要な条件は、関数が延期される前に評価されます。修正バージョンは次のとおりです:

defer fmt.Println(*age)

if *age <= 13 {
    ticketPrice = 9.99
} else if *age > 13 && *age < 65 {
    ticketPrice = 19.99
} else if *age >= 65 {
    ticketPrice = 12.99
}
defer fmt.Println(ticketPrice)

これで、fmt.Println(*age) と fmt.Println(ticketPrice) の両方が延期され、逆の順序で実行され、正しい年齢とチケット価格が表示されます。

以上がGo で遅延ステートメントが予想されるチケット価格を生成しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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