从标准输入读取映射键

Read map key from stdin

我有一个从字符串到整数的映射,我想 select 通过从标准输入读取键来得到一个值。很简单,你可能会说:

  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。

如果我猜的话,使用 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

来自文档:

ReadString 一直读取到输入中第一次出现 delim,返回包含数据的字符串 包括分隔符

如果您对字符串进行切片并删除最后一个字符,它应该可以工作:

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