所以我有一个带有一些条目的Go变量table map[string]string
。我可以按预期使用字符串键访问地图值:
table["key"] // ok
但是当我尝试使用从os.Stdin
...
reader, _ := bufio.NewReader(os.Stdin)
key, _ := reader.ReadString('\n') // type "key" (no quotations), press enter
value, _ := table[key] // no value :(
可能出现什么问题?
答案 0 :(得分:3)
有关ReadString的文档说:
ReadString读取直到输入中第一次出现delim,返回包含数据的字符串,包括分隔符。
因此,键变量包含键字符串加\ n(或Windows上的\ r \ n),并且在地图中找不到它。
答案 1 :(得分:2)
确保您的密钥不包含分隔符' \n
'包含在bytes.ReadString()
中:
(更一般地说,不要忽略返回值,尤其是错误)
在http://ideone.com/qgvsmF上查看此runnable(!)示例:
package main
import "bufio"
import "fmt"
import "os"
func main() {
table := make(map[string]string)
table["key1"] = "val1"
table["key2"] = "val2"
table["key3"] = "val3"
fmt.Println("Enter a key (followed by Return):")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
panic(err)
}
val, ok := table[input]
fmt.Println("val for key '" + input + "' = '" + val + "'(" + fmt.Sprintf("%v", ok) + ")")
}
它会显示一个等于的键:
'key2
'
Remove the last character of your string,如此runnable example:
input = strings.TrimRight(input, "\r\n")
输出:
Enter a key (followed by Return):
val for key 'key2' = 'val2'(true)