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

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

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

  1. func takeInput() {
  2. fmt.Println("How old are you ?")
  3. var age int32
  4. _, err := fmt.Scanln(&age)
  5. if err != nil {
  6. takeInput()
  7. return
  8. }
  9. if age < 18 {
  10. fmt.Printf("sorry but, you still have %d years to go kid", 18-age)
  11. } else if age > 18 {
  12. fmt.Println("well, bottoms up then!")
  13. }
  14. }
  15. func main() {
  16. takeInput()
  17. }

字符串
输出如下所示

  1. How old are you ?
  2. wyk
  3. How old are you ?
  4. How old are you ?
  5. How old are you ?
  6. How old are you ?
  7. _


我尝试在每个递归循环之前添加一个计数器,实际上它为每个字母旋转一个新的循环,同时每字母+ 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的内容,您将更清楚地看到它:
  1. How old are you ?
  2. a 12
  3. How old are you ?
  4. sorry but, you still have 6 years to go kid

个字符

展开查看全部

相关问题