>백엔드 개발 >Golang >bufio.Scanner의 입력 루프를 벗어나려면 If 절이 필요합니까?

bufio.Scanner의 입력 루프를 벗어나려면 If 절이 필요합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-08 07:51:02824검색

Is an If-Clause Necessary to Break Out of bufio.Scanner's Input Loop?

If 절 없이 input.Scan() 중단

입력 처리는 Go 프로그램에서 사용자와 상호 작용하는 데 중요합니다. bufio.Scanner 패키지는 콘솔에서 입력을 읽는 편리한 방법을 제공합니다. 그러나 기본 Scanner의 분할 기능인 ScanLines는 예상과 다르게 동작할 수 있으므로 입력 루프를 중단하기 위해 if 절이 필요한지 궁금해하는 사람들도 있습니다.

제공된 코드 조각은 중단을 위한 일반적인 접근 방식을 보여줍니다. if 절을 사용한 입력 루프:

input := bufio.NewScanner(os.Stdin)
for input.Scan() {
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}

그러나 문서에는 ScanLines가 입력 끝에 도달하면 false를 반환한다고 명시되어 있습니다. 또는 오류가 발생했습니다. 문서의 다음 구절은 if 절이 필요하지 않을 수도 있음을 시사합니다.

Scan advances the Scanner to the next token, which will then be available through the Bytes or Text method. It returns false when the scan stops, either by reaching the end of the input or an error. After Scan returns false, the Err method will return any error that occurred during scanning, except that if it was io.EOF, Err will return nil.

자세히 조사해 보면 이 가정이 틀렸다는 것이 분명해집니다. ScanLines는 실제로 기본적으로 Scanned 함수의 미리 정의된 기본 분할 함수입니다. 설명서에는 ScanLines가 후행 줄 끝 표시를 제거한 각 텍스트 줄을 반환한다고 명시되어 있습니다. 즉, 빈 줄이 반환되고, 줄 바꿈이 없더라도 입력의 비어 있지 않은 마지막 줄이 반환됩니다.

따라서 빈 줄은 입력 스트림의 끝을 알리지 않으며, 조기 종료 시나리오를 처리하려면 if 절이나 대체 방법을 사용하는 것이 중요합니다. 다음 스니펫은 대체 접근 방식을 보여줍니다.

input := bufio.NewScanner(os.Stdin)
for {
    if !input.Scan() {
        break
    }
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}

결론적으로 ScanLines는 입력 끝에 도달하면 false를 반환하지만 마지막 줄에 줄 끝 표시가 없고 빈 줄이 반환되면 if 절이나 대체 접근 방식을 사용하여 입력 루프를 정상적으로 중단해야 합니다.

위 내용은 bufio.Scanner의 입력 루프를 벗어나려면 If 절이 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.