ホームページ  >  記事  >  バックエンド開発  >  io.Reader と fmt.Fscan の無限ループ

io.Reader と fmt.Fscan の無限ループ

WBOY
WBOY転載
2024-02-09 17:45:191184ブラウズ

io.Reader 与 fmt.Fscan 无限循环

phpエディタStrawberryがこの記事でio.Readerとfmt.Fscanの無限ループ問題を紹介します。 fmt.Fscan関数を使用して入力を読み取る場合、読み取った内容が入力形式と一致しない場合、無限ループが発生します。この問題は私たちに多くのトラブルを引き起こすかもしれませんが、いくつかのヒントと注意事項を使えば、この問題は簡単に解決できます。次に、io.Reader と fmt.Fscan の無限ループを回避して、これら 2 つの関数をより効果的に使用する方法を詳しく説明します。

質問内容

理由はわかりませんが、io.reader の実装に何らかの欠陥があるようです。

io.reader のドキュメントには、ゼロ以外のバイト数とゼロ以外のエラーを返しても問題ないと記載されています:

リーリー

しかし、これは fmt.fscan には影響せず、代わりにプログラムをハングさせます:

リーリー

もちろん、io.eof を単独で使用した場合、バイト数が 0 を返せば機能します。

リーリー

元の実装に欠陥があるのでしょうか、それとも io.reader のこの特定のロギング動作に依存せず、読み取るデータがなくなった場合は常に単独で戻るべきでしょうか 0, io .eof?

回避策

fmt.scanf は戻り数と io.eof を正しく処理しますが、io.eof## でも処理されます #その後、リーダーは値を返し続けます。

スキャナーの実装は、

io.readatleast を使用する io.readfull の使用に依存しているため、重複読み取りを処理するには、より完全な実装が必要になります。これをテストするには、eof をトレースする拡張バージョンを使用します。最初の readio.eof を返しますが、fmt.fscan を使用しても期待どおりに動作します。一緒に。

ドキュメントからの主な抜粋:

io.readfull:

...読み取り中の eof を報告するエラーとして扱いません。

io.readatleast:

エラーは、バイトが読み取られなかった場合にのみ eof になります。

これらの

io ヘルパーは自分自身で io.eof を解釈する必要があるため、呼び出し元は返される実際のデータのみを検索できます。リーダーはデータを返し続けるため、無限に繰り返し呼び出されます。これは、リーダー上で io.readall を繰り返し呼び出し、毎回別の値を返すことで簡単に実証できます。 リーリー

https://www.php.cn/link/ad6fff7b7be06acff1c63ced9f0da4ea

以上がio.Reader と fmt.Fscan の無限ループの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。