为什么 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 提供了有关所发生错误的附加上下文。
总之,由于 Windows 上的兼容性问题,fmt.Scanf 过去的行为异常。但是,此问题已得到解决,并且在格式字符串中使用换行符检查可确保它现在等待用户输入。此外,包含输入验证允许我们验证用户是否输入了有效值,例如整数或非空响应。
以上是为什么 Go 的 `fmt.Scanf` 不总是等待用户输入?的详细内容。更多信息请关注PHP中文网其他相关文章!