Go语言 递归函数中的意外行为取决于Scanln错误值

m1m5dgzv  于 2024-01-04  发布在  Go
关注(0)|答案(1)|浏览(136)

为什么当我执行这段代码并在cmd提示符中输入一个类似“wyk”的字符串时,函数takeInput()在接受新输入之前会向cmd打印"How old are you"四次?

func takeInput() {
    fmt.Println("How old are you ?")
    var age int32
    _, err := fmt.Scanln(&age)
    if err != nil {
        takeInput()
        return
    }
    if age < 18 {
        fmt.Printf("sorry but, you still have %d years to go kid", 18-age)
    } else if age > 18 {
        fmt.Println("well, bottoms up then!")
    }
}

func main() {
    takeInput()
}

字符串
输出如下所示

How old are you ?
wyk
How old are you ?
How old are you ?
How old are you ?
How old are you ?
_


我尝试在每个递归循环之前添加一个计数器,实际上它为每个字母旋转一个新的循环,同时每字母+ 1打印一次语句。即使我输入一个数字,如19,它也会将计数器增加2(但它不会执行Println)。

2exbekwf

2exbekwf1#

事情是这样的:

  1. fmt.Scanln扫描输入。它只需要读取一个字符来确定输入不是有效的整数:w
  2. fmt.Scanln返回错误。
    1.您再次递归调用takeInput,这将打印How old are you ?
  3. fmt.Scanln扫描输入。它只需要读取一个字符来确定输入不是有效的整数:y
  4. fmt.Scanln返回错误。
    1.您再次递归调用takeInput,这将打印How old are you ?
  5. fmt.Scanln扫描输入。它只需要读取一个字符来确定输入不是有效的整数:k
  6. fmt.Scanln返回错误。
    1.您再次递归调用takeInput,这将打印How old are you ?
    换句话说,How old are you ?对于输入中的每个无效字符打印一次。
    尝试输入类似a 12a 20的内容,您将更清楚地看到它:
How old are you ?
a 12
How old are you ?
sorry but, you still have 6 years to go kid

个字符

相关问题