fmt.Scanln 予期しない改行エラー: Go の入力処理の詳細
多くの Go 開発者は、次の場合に「fmt.Scanln 予期しない改行エラー」に遭遇します。ユーザー入力と対話します。このエラーを理解するには、fmt.Scan と fmt.Scanln の仕組みを詳しく調べることが重要です。
fmt.Scan とスペース区切り入力
fmt.Scan reads space-標準入力から入力を分離します。 fmt.Scan に提供される各引数は、スペースで区切られた単一の単語または値に対応します。改行の存在はスペースとして扱われるため、複数行の入力が可能になります。これは、次のコードで例示されます。
<code class="go">import "fmt" func main() { var i int _, err := fmt.Scan(&i) if err == nil { fmt.Println("read 1 integer: ", i) } }</code>
入力「123」を指定すると、このコードは「read 1 integer: 123」を読み取り、出力します。
fmt.Scanlnおよび改行区切り入力
対照的に、fmt.Scanln は区切り文字として改行文字を期待します。改行まですべての入力を読み取った後、解析を停止します。これは、Scanln のドキュメントに明確に記載されています:
「Scanln は Scan に似ていますが、改行でスキャンを停止し、最後の項目の後には改行または EOF が必要です。」
この動作これは次のコードに現れます:
<code class="go">import "fmt" func main() { var s string _, err := fmt.Scanln(&s) if err == nil { fmt.Println("read 1 line: ", s) } }</code>
「みんなアイスクリームが大好き」と入力すると、このコードは「1 行読んで: みんなアイスクリームが大好き」を読み取って出力します。 fmt.Scanln は最後の改行でのみ区切られるため、スペースで区切られた "everybody" と "loves" が存在しても解析は中断されません。
エラーの理解
In提供された最初の例では、入力文字列「everybody love Ice Cream」が改行で終わっていないため、Scanln は「expected newline」というエラーを検出します。これを解決するには、入力の末尾に改行文字が存在する必要があります。
行を読み取るための代替方法
目的が入力行を読み取ることである場合は、ReadString を使用します。 bufio.Reader パッケージの fmt.Scanln:
<code class="go">import ( "bufio" "os" ) func main() { reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') if err == nil { fmt.Println("read 1 line: ", line) } }</code>
以上がfmt.Scanln 予期しない改行エラー: fmt.Scan と fmt.Scanln の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。