ホームページ >バックエンド開発 >Golang >条件チェックを行わずに Go `bufio.Scanner` 入力ループを回避できますか?

条件チェックを行わずに Go `bufio.Scanner` 入力ループを回避できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-14 14:52:02536ブラウズ

Can You Escape the Go `bufio.Scanner` Input Loop Without a Conditional Check?

条件チェックなしで入力ループをエスケープする

Go では、bufio.Scanner を使用してコンソールから入力を 1 行ずつ読み取ることができます。ただし、標準の Scan 関数は自動的に次のトークンに進み、明示的なブレーク条件がない場合は無限ループが発生する可能性があります。

ドキュメントには、入力の終わりに達すると Scan が false を返すと記載されています。これは、ループから抜け出すための条件チェックをスキップできるという意味ですか?

ドキュメントの誤解

残念ながら、ドキュメントの解釈を誤っていました。スキャナで使用されるデフォルトの分割関数は ScanLines で、テキストの各行を個別のトークンとして返します。

ScanLines の動作

ScanLines には 2 つの重要な動作があります。

  1. 空行が返されます:ループの流れに影響を与えることなく、たとえ連続した空行であっても空行を返すことができます。
  2. 改行のない空でない行: 入力の最後の空でない行は、たとえ連続していても返されます。改行文字がない場合。

Loop

したがって、空の行だけでは入力の終了を示しません。ループはファイルの終わり (EOF) 条件に達した場合にのみ中断されます。通常は Ctrl-D を押すなどのアクションによってトリガーされます。

解決策

エスケープするにはif 句のない入力ループでは、次のいずれかを行う必要があります。

  • 次の方法で空行の場合を手動で処理します。 check input.Text() == ""
  • 空行に遭遇した場合に false を返すカスタム分割関数を使用します

ただし、一般的には条件チェックを維持することをお勧めします。シンプルにして、潜在的なエッジケースを回避します。

以上が条件チェックを行わずに Go `bufio.Scanner` 入力ループを回避できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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