【问题标题】:Stop console printing the same message multiple times when inputting an string instead of integer输入字符串而不是整数时,停止控制台多次打印相同的消息
【发布时间】:2020-04-01 22:19:20
【问题描述】:

在我的 CLI 程序中,我有这个功能,用户可以告诉我他们想要多少商品。因此,此输入应为整数。

我目前遇到一个问题,如果他们输入一个字符串,它会出错expected an integer,但随后还会再次打印该问题多次而不是一次。

例子:

How many Fruit Tea would you like to buy? qwe
expected integer
How many Fruit Tea would you like to buy? expected integer
How many Fruit Tea would you like to buy? expected integer
How many Fruit Tea would you like to buy?

以下是处理此功能的代码

for {
    fmt.Printf("How many %v would you like to buy? ", product.Name)
    _, err := fmt.Scan(&response)
    if err != nil {
        fmt.Println(err)
        continue
    }

    if ok, err := validResponse(response); ok {
        break
    } else {
        fmt.Println(err)
        continue
    }
}

我必须在这个循环中更改什么,以便它只重复一次问题?

【问题讨论】:

  • 只需将最初的问题移到 for 循环之外
  • @Vasanth 的问题是,一旦他们输入一串文本而不是整数,它就会打印错误但不会重复问题

标签: go console


【解决方案1】:

如果可以,请将response 的类型从int 切换为string,然后使用包strconv(如strconv.Atoi())解析输入字符串。我怀疑Scan 正在尝试将您输入的每个字符作为单独的 int 读取,每次都失败,并且每次都运行循环,直到所有字符都被消耗完。

例如

    for {
        var response string
        fmt.Printf("How many %v would you like to buy? ", product.Name)
        _, err := fmt.Scanln(&response)
        if err != nil { // probably don't need to check err from Scan()
            fmt.Println(err)
            continue
        }
        num, err := strconv.Atoi(response)
        if err != nil {
            fmt.Println("Enter an integer.")
            continue
        }

        if ok, err := validResponse(num); ok && err==nil {
            break
        } else {
            fmt.Println(err)
            continue
        }
    }

【讨论】:

  • 是的,行得通。我确实想到了这种方法,但认为也许有更简单的方法。好像没有!感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2013-12-11
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多