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

WBOY
リリース: 2024-02-09 17:45:19
転載
1153 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!