ホームページ > バックエンド開発 > Golang > Go の `fmt.Scanf` が常にユーザー入力を待たないのはなぜですか?

Go の `fmt.Scanf` が常にユーザー入力を待たないのはなぜですか?

Patricia Arquette
リリース: 2024-12-15 10:13:10
オリジナル
925 人が閲覧しました

Why Doesn't Go's `fmt.Scanf` Always Wait for User Input?

Go の Fmt.Scanf がユーザー入力を待たない理由

Caleb Doxsey の Go プログラミングの本では、次の使用に関して疑問が生じます。 fmt.Scanf.この問題は、プログラムが 2 回目の Scanf の後にユーザー入力を待って一時停止しないという事実によって発生します。さらに、ユーザー入力、特に整数や空でない値を検証するタスクに取り組む必要があります。

この動作を理解するには、fmt.Scanf の内部動作を詳しく調べる必要があります。 Go の以前のバージョンでは、fmt.Scanf には制限がありました。復帰 (r) とその後に続く改行 (n) を有効な改行文字としてみなしていました。ただし、この動作は、改行文字として r のみを使用する Windows の規則と衝突します。その結果、fmt.Scanf はユーザー入力を待たずにすぐに次の Scanf に進みます。

この問題を解決して入力処理を改善するには、有効な入力のチェックを含む次の修正コードを検討してください。

import (
    "fmt"
)

func main() {
    var inputSquare float64
    n, err := fmt.Scanf("%f\n", &inputSquare)
    if err != nil || n != 1 {
        fmt.Println(n, err)
    }

    var inputGuess float64
    n, err = fmt.Scanf("%f\n", &inputGuess)
    if err != nil || n != 1 {
        fmt.Println(n, err)
    }
}
ログイン後にコピー

フォーマット文字列に「n」を含めることで、ユーザーが新しい行を入力した場合にのみ fmt.Scanf が続行され、行が移動する問題がなくなります。入力を待たずに先に進みます。さらに、Scanf から返される n 変数と err 変数を使用した入力検証が行われるようになりました。 n が 1 に等しくない場合は、エラーがあったか、ユーザーが有効な入力を何も入力しなかったことを示します。 err は、発生したエラーに関する追加のコンテキストを提供します。

結論として、fmt.Scanf は、Windows の互換性の問題により、過去に予期しない動作をしていました。ただし、この問題はその後解決され、書式文字列で改行チェックを使用することで、ユーザー入力を待機するようになりました。さらに、入力検証を含めることで、ユーザーが整数や空でない応答などの有効な値を入力したかどうかを検証できます。

以上がGo の `fmt.Scanf` が常にユーザー入力を待たないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート