Как продолжить выполнение программы при использовании bufio.Scanner в golang - PullRequest
0 голосов
/ 04 января 2019

Простите, я начинаю с Go и узнаю о пакете bufio, но каждый раз, когда я использую тип сканера, командная строка застревает на входе и не продолжает нормальную работу программы. Я пытался нажать Enter, но он просто переходит на новую строку.

Вот мой код.

/*
Dup 1 prints the text of each line that appears more than
once in the standard input, proceeded by its count.
*/
package main

import(
  "bufio"
  "fmt"
  "os"
)

func main(){
  counts := make(map[string]int)
  fmt.Println("Type Some Text")
  input := bufio.NewScanner(os.Stdin)

  for input.Scan(){
    counts[input.Text()]++
  }
  //NOTE: Ignoring potential Errors from  input.Err()

  for line,n := range counts{
    if n > 1{
      fmt.Printf("%d \t %s \n",n,line)
    }
  }
}

1 Ответ

0 голосов
/ 04 января 2019

У вас есть цикл for, который читает строки из стандартного ввода.Этот цикл будет выполняться до тех пор, пока os.Stdin не выдаст io.EOF (это один из случаев, когда Scanner.Scan() вернет false).Обычно этого не происходит.

Если вы хотите «смоделировать» конец ввода, нажмите Ctrl + Z в Windows или Ctrl + D в системах Linux / Unix.

Поэтому введите несколько строк (каждая «закрыта» на Введите ), и когда вы закончите, нажмитевышеупомянутый ключ.

Пример вывода:

Type Some Text
a
a
bb
bb 
bbb                               <-- CTRL+D pressed here
2        a 
2        bb 

Другой вариант - использовать «специальное» слово для завершения, например "exit".Это может выглядеть так:

for input.Scan() {
    line := input.Text()
    if line == "exit" {
        break
    }
    counts[line]++
}

Тестирование:

Type Some Text
a
a
bb
bb
bbb
exit
2        a 
2        bb 
...