首页 >后端开发 >Golang >为什么 Go 的 `fmt.Scanf` 不总是等待用户输入?

为什么 Go 的 `fmt.Scanf` 不总是等待用户输入?

Patricia Arquette
Patricia Arquette原创
2024-12-15 10:13:10929浏览

Why Doesn't Go's `fmt.Scanf` Always Wait for User Input?

为什么 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn