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 サイトの他の関連記事を参照してください。