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 をトレースする拡張バージョンを使用します。最初の
read は
io.eof を返しますが、
fmt.fscan を使用しても期待どおりに動作します。一緒に。
io.readfull:
io.readatleast:
これらの
io ヘルパーは自分自身で
io.eof を解釈する必要があるため、呼び出し元は返される実際のデータのみを検索できます。リーダーはデータを返し続けるため、無限に繰り返し呼び出されます。これは、リーダー上で
io.readall を繰り返し呼び出し、毎回別の値を返すことで簡単に実証できます。
リーリー
https://www.php.cn/link/ad6fff7b7be06acff1c63ced9f0da4ea
以上がio.Reader と fmt.Fscan の無限ループの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。