D
D
danforth2016-10-10 22:08:00
go
danforth, 2016-10-10 22:08:00

Why doesn't the line input counter work in Go?

Hello! I am reading the book The Go Programming Language (2016) [Kernighan B., Donovan A.], and here in one of the first chapters there is a small example program. I enter all these examples on my PC so that the "muscle memory" fills up and gets used to the syntax. The essence of the program is that it reads the input, and shows how many times you entered a certain text.

package main

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

func main() {
  counts := make(map[string]int)
  input := bufio.NewScanner(os.Stdin)

  for input.Scan() {
    counts[input.Text()]++
  }

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

Проблема в том, что ни под Windows 10 x64, ни под ubuntu/xenial64 на версии golang-1.7.1 данная программа не отрабатывает. Вот что я делаю:
  1. go run main.go
  2. пишу test
  3. опять пишу test, и т.д., она ничего не считает, хотя консоль уходит в прослушку (пропадает путь к файлу, выглядит это так будто программа действительно слушает мой ввод)

Подскажите, в чем проблема данного примера, и почему ничего не работает?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Алексей, 2016-10-10
@danforth

Попробуйте (win): type имяфайла.txt | go run main.go
Если вводить данные в консоли, то нужно обозначить "конец файла" нажатием Ctrl+Z + Enter.
Либо как-то иначе читать данные с консоли.

X
xotkot, 2016-10-11
@xotkot

добавлю к выше написанному что для unix-подобных признак конца файла будет сочетание клавиш Ctrl+D.
Также для данной задачи можно использовать конвейер:

$ echo "aaaf\nddd\nddd"| go run main.go
2	ddd

Есть ещё один вариант, это просто добавить ключ выхода в цикл for input.Scan() ..., например:
if input.Text() == "exit" {
    break
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question