Как обработать проверку типа ввода консоли в Go - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь построить очень простые консольные входы для программы, используя цикл. Однако, когда пользователь вводит что-то кроме целого числа, сообщение об ошибке срабатывает столько раз, сколько есть символов во входной строке (включая символ новой строки).

Я пробовал Scan (), Scanln (), а также bufio.NewReader () с разбором строк, а также с использованием continue после Println (). Все дают одинаковый результат.

var threads int

func main() {
    fmt.Println("Enter number of threads:")
    for {
        _, err := fmt.Scanln(&threads)
        if err != nil {
            fmt.Println("Enter a valid number")
        } else {
            break
        }
    }
}

Вводимые пользователем данные:

ASD

Ожидаемый результат:

Программа: введите правильный номер

Фактический результат:

Программа: введите правильный номер

Программа: введите правильный номер

Программа: введите правильный номер

Программа: введите правильный номер

1 Ответ

1 голос
/ 31 мая 2019

fmt.Scanln(&threads) выдает ошибку, потому что ваш первый символ уже не является допустимым int, таким образом, в буфере stdin остается sd\n, это будет моим объяснением для дополнительных трех ошибок.Чтобы избежать этого, вы можете просто прочитать строку и затем использовать int, err := strconv.Atoi(string), как показано в коде ниже.Обратите внимание, что fmt.Scan или fmt.Scanln разделяет ваш пользовательский ввод до следующего пробела, что, вероятно, не идеально для вашего варианта использования.Проверьте Как читать ввод с консоли , чтобы узнать, как выбрать подходящий вариант использования.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var s string
    var i int
    fmt.Println("Enter number of threads:")
    for {
        _, err := fmt.Scan(&s)
        i, err = strconv.Atoi(s)
        if err != nil {
            fmt.Println("Enter a valid number")
        } else {
            fmt.Println("Got: " + strconv.Itoa(i))
            break
        }
    }
    //Todo
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...