Go の fmt.Scanf で無効な入力を処理する方法
fmt.Scanf() の使用中に無効な入力に関する問題が発生した場合は、次のようになります。整数の代わりに文字列が入力されたときにプログラムが無限ループに陥る理由を理解するのに不可欠です。
Go では、fmt.Scanf() は特定の形式指定子 (例: "%d) の入力ストリームを解析します。 " 10 進整数の場合)。文字列などの無効な入力はエラーを引き起こしますが、入力は Stdin バッファーに残ります。その結果、その後の fmt.Scanf() の呼び出しでは同じ無効な入力が処理され続け、無限ループが発生します。
fmt.Scanln を使用した解決策
代替アプローチfmt.Scanln() を使用することですが、動作が異なります。無効な文字を含む入力行全体を読み取り、消費します。これは次のように実装できます:
<code class="go">fmt.Printf("Please enter an integer: ") // Read in an integer var i int _, err := fmt.Scanln(&i) if err != nil { fmt.Printf("Error: %s", err.Error()) // If int read fails, read as string and forget var discard string fmt.Scanln(&discard) return } fmt.Printf("Input contained %d", i)</code>
追加オプション
fmt.Scanln() が最適でない場合、他のオプションは次のとおりです:
以上がGo で fmt.Scanf() が無効な入力による無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。