Go의 Fmt.Scanf가 사용자 입력을 기다리지 않는 이유
Caleb Doxsey의 Go 프로그래밍 책에서 다음과 같은 질문이 제기됩니다. fmt.Scanf. 문제는 프로그램이 사용자 입력을 기대하면서 두 번째 Scanf 이후에 일시 중지되지 않는다는 사실에서 비롯됩니다. 또한 사용자 입력, 특히 정수 및 비어 있지 않은 값의 유효성을 검사하는 작업을 해결해야 합니다.
이 동작을 이해하려면 fmt.Scanf의 내부 작동 방식을 자세히 조사해야 합니다. Go의 이전 버전에서는 fmt.Scanf에 제한이 있었습니다. 즉, 캐리지 리턴(r) 뒤에 개행 문자(n)가 오는 것을 유효한 개행 문자로 간주했습니다. 그러나 이 동작은 r만 개행 문자로 사용하는 Windows 규칙과 충돌했습니다. 결과적으로 fmt.Scanf는 사용자 입력을 기다리지 않고 즉시 다음 Scanf로 진행합니다.
이 문제를 해결하고 입력 처리를 개선하려면 유효한 입력 확인을 포함하는 다음 수정 코드를 고려하세요.
import ( "fmt" ) func main() { var inputSquare float64 n, err := fmt.Scanf("%f\n", &inputSquare) if err != nil || n != 1 { fmt.Println(n, err) } var inputGuess float64 n, err = fmt.Scanf("%f\n", &inputGuess) if err != nil || n != 1 { fmt.Println(n, err) } }
형식 문자열에 "n"을 포함하면 사용자가 새 줄을 입력한 후에만 fmt.Scanf가 진행되므로 기다리지 않고 앞으로 이동하는 문제가 제거됩니다. 입력용. 또한 이제 Scanf에서 반환된 n 및 err 변수를 사용하여 입력 유효성을 검사합니다. n이 1이 아닌 경우 오류가 발생했거나 사용자가 유효한 입력을 입력하지 않았음을 나타냅니다. err은 발생한 오류에 대한 추가 컨텍스트를 제공합니다.
결론적으로, fmt.Scanf는 과거 Windows의 호환성 문제로 인해 예기치 않게 동작했습니다. 그러나 이 문제는 이후 해결되었으며 형식 문자열에 개행 검사를 사용하면 이제 사용자 입력을 기다립니다. 또한 입력 유효성 검사를 포함하면 사용자가 정수 또는 비어 있지 않은 응답과 같은 유효한 값을 입력했는지 여부를 확인할 수 있습니다.
위 내용은 Go의 `fmt.Scanf`는 왜 항상 사용자 입력을 기다리지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!