从标准输入读取映射键
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]])
我有一个从字符串到整数的映射,我想 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]])