Остановите консольную печать одного и того же сообщения несколько раз при вводе строки вместо целого числа - PullRequest
1 голос
/ 02 апреля 2020

В моей программе 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
    }
}

Что я должен изменить в этом l oop, чтобы он повторял вопрос только один раз?

1 Ответ

2 голосов
/ 02 апреля 2020

Если вы можете, переключите тип response с int на string, а затем проанализируйте входную строку, используя пакет strconv (например, strconv.Atoi()). Я подозреваю, что Scan пытается прочитать каждый введенный вами символ как отдельное целое, каждый раз терпит неудачу и запускает l oop каждый раз, пока все символы не будут использованы.

например

    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
        }
    }
...