Подтвердить что ты не робот

Разрыв входных данных. Scan()

У меня есть этот простой код для чтения всего ввода с консоли:

input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the console

for input.Scan() {
    if input.Text() == "end" { break } //Break out of input loop when the user types the word "end"
    fmt.Println(input.Text())
}

Код как работает. То, что я хочу сделать, это избавиться от if-предложения. В моем понимании документации, если строка пуста, input.Scan() должен возвращать false и, следовательно, выходить из цикла.

Сканирование продвигает сканер к следующему токену, который затем будет доступен через метод Bytes или Text. Он возвращает false, когда сканирование останавливается, либо достигнув конца ввода, либо ошибки. После того, как Scan вернет false, метод Err вернет любую ошибку, которая произошла во время сканирования, за исключением того, что если она была io.EOF, Err вернет нуль. Сканирование паники, если функция split возвращает 100 пустых токенов, не продвигая вход. Это обычный режим ошибок для сканеров.

Я неверно истолковал документацию, и на самом деле необходимо, чтобы такое условие if-break разразилось? (Я использую Go 1.5.2, запуская программу, используя "go run".)

4b9b3361

Ответ 1

Я думаю, вы неправильно читаете документацию. Сканер по умолчанию - функция ScanLines.

Документация гласит:

ScanLines - это функция разделения для сканера, которая возвращает каждую строку текст, лишенный любого конечного маркера конца строки. Возвращенная строка может быть пустым. Маркер конца строки - это один дополнительный возврат каретки за которым следует одна обязательная новая строка. В обозначениях регулярных выражений это \r?\n. Последняя непустая строка ввода будет возвращена, даже если он не имеет новой строки.

Два важных момента:

  • Линия возврата может быть пустой: это означает, что она возвращает пустые строки.
  • Последняя непустая строка ввода будет возвращена, даже если она не имеет новой строки: это означает, что последняя строка файла всегда возвращается, если она не пуста. Это не означает, что пустая строка заканчивается потоком.

Сканер остановится на EOF (конец файла). Например, набрав Ctrl-D, вы отправите конец файла и остановите сканер.

Ответ 2

Ввод пустой новой строки автоматически не остановит сканер.

Если он не сломался, не исправляйте его, но вы можете заставить его вести себя так, как вам нужно. Это не избавит вас от вашего блока if, но будет функционировать так, как вы ожидали, сканера, то есть нажатие ввода без ввода приведет к остановке сканера:

    input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the console

    for input.Scan() {
        if input.Text() == "" {
            break
        } 
        fmt.Println(input.Text())
    }

Ответ 3

Вы не неправильно истолковываете документацию.

Он возвращает ложь, когда сканирование останавливается, либо по достижению конца ввода, либо по ошибке.

Какая документация гласит правильно. Но вам не хватает того, что вам нужен способ обеспечить завершение ввода, т.е. EOF с консоли.

В Linux вы можете нажать "CTRL + D", который сигнализирует EOF с терминала.

Хотя здесь есть небольшой улов, "CTRL + D" работает только в начале строки. Таким образом, чтобы завершить ввод с терминала, вам нужно перейти на новую строку и нажать "CTRL + D" в качестве первого ввода в строке.

Ответ 4

Для систем Mac, вы можете попробовать Ctrl + D чтобы сломать по умолчанию. Если вы находитесь в конце строки, вам придется нажать Ctrl + D 2 раза.

Ответ 5

CTRL+D чтобы разбить, если вы хотите легко вводить данные, вы можете использовать cat input.txt | go run script.go cat input.txt | go run script.go или go run script.go < input.txt.