>백엔드 개발 >Golang >io.Reader 및 fmt.Fscan 무한 루프

io.Reader 및 fmt.Fscan 무한 루프

WBOY
WBOY앞으로
2024-02-09 17:45:191205검색

io.Reader 与 fmt.Fscan 无限循环

php 편집기 Strawberry는 이 기사에서 io.Reader 및 fmt.Fscan의 무한 루프 문제를 소개합니다. fmt.Fscan 함수를 사용하여 입력을 읽을 때 읽은 내용이 입력 형식과 일치하지 않으면 무한 루프가 발생합니다. 이 문제는 우리에게 많은 문제를 일으킬 수 있지만 몇 가지 요령과 예방 조치를 통해 이 문제를 쉽게 해결할 수 있습니다. 다음에는 이 두 기능을 더 잘 활용하는 데 도움이 되도록 io.Reader와 fmt.Fscan에서 무한 루프를 방지하는 방법을 자세히 설명하겠습니다.

질문 내용

이유는 모르겠지만 io.reader구현에 뭔가 결함이 있는 것 같은데요?

io.reader 문서에는 0이 아닌 바이트 수와 0이 아닌 오류를 반환해도 괜찮다고 나와 있습니다.

으아악

그러나 이는 fmt.fscan에서는 작동하지 않으며 대신 프로그램이 중단됩니다.

으아악

물론, io.eof만 사용하면 0바이트 수를 반환합니다.

으아악

원래 구현에 결함이 있습니까? 아니면 io.reader 的这一特定记录行为,并且在没有更多数据可供读取时始终单独返回 0, io.eof

解决方法

fmt.scanf 确实正确处理返回计数和 io.eof,但即使在 io.eof의 특정 로깅 동작에 의존하지 않고 더 이상 읽을 데이터가 없을 때 항상 0, io.eof만 반환해야 합니까?

해결 방법

io.readfull,而后者使用 io.readatleast,因此您将需要一个更完整的实现来处理重复读取。您可以通过使用跟踪 eof 的扩展版本来测试这一点,并在第一个 read 上返回 io.eof ,它仍然可以按预期与 fmt.fscanfmt.scanf는 반환 횟수와

를 올바르게 처리하지만 독자는

이후에도 계속 값을 반환합니다.

스캐너 구현은 io.readfull를 사용하는

사용에 의존하므로 중복 읽기를 처리하려면 더 완전한 구현이 필요합니다. 첫 번째 읽기에서

를 추적하고 반환하는 확장 버전의 eof를 사용하여 이를 테스트할 수 있으며 예상대로

에서도 계속 작동합니다.

io.readatleast문서에서 발췌한 주요 내용:

io 帮助程序需要自己解释 io.eof ,所以它们的调用者只能查找返回的实际数据,并且由于您的阅读器继续返回数据,它们将无限期地重复调用。通过在阅读器上重复调用 io.readall...읽은 eof를 보고할 오류로 처리하지 않습니다

읽은 바이트가 없는 경우에만 오류가 발생합니다. 🎜 🎜이러한 io 도우미는 스스로 해석해야 🎜하므로 호출자는 반환된 실제 데이터만 조회할 수 있으며 리더는 계속 데이터를 반환하므로 무기한 반복적으로 호출됩니다. 이는 리더에서 io.readall을 반복적으로 호출하여 매번 다른 값을 반환함으로써 쉽게 설명할 수 있습니다. 🎜 으아악 🎜🎜https://www.php.cn/link/ad6fff7b7be06acff1c63ced9f0da4ea🎜🎜

위 내용은 io.Reader 및 fmt.Fscan 무한 루프의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제