Прочитать ключ карты из стандартного ввода - PullRequest
0 голосов
/ 04 августа 2020

У меня есть карта из строк в целые числа, я хочу выбрать значение, прочитав ключ из стандартного ввода. Достаточно просто, вы можете сказать:

  package main
  import (
           "os"
           "bufio"
           "fmt"
  )
 
 func main() {
         m := map[string]int {
                 "Hello": 1,
                 "Map": 2,
         }
 
         reader := bufio.NewReader(os.Stdin)
         text, err := reader.ReadString('\n')
 
         if err != nil {
                 fmt.Println("Error", err)
                 return
         }
 
         fmt.Println(m[text])
 }

При записи «Hello» в консоль выводится 0, а не 1.

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

Если бы я догадался, использование reader.ReadString добавляет пользовательский ввод с \n. Таким образом, поле text оказывается Hello\n

Использование budio.NewScanner() устраняет эту проблему:

func main() {
    m := map[string]int{
        "Hello": 1,
        "Map":   2,
    }

    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    text := scanner.Text()

    fmt.Println(m[text])
}

Вывод:

$ go run main.go
Hello
1
0 голосов
/ 04 августа 2020

Из документов:

ReadString читает до первого вхождения разделителя во входных данных, возвращая строку, содержащую данные до , включая разделитель .

Если вы разрежете строку и удалите последний символ, он должен работать:

fmt.Println(m[text[:len(text)-1]])
...