如何使用存储在Go中的变量中的字符串键访问映射条目?

时间:2014-11-29 13:19:00

标签: map go

所以我有一个带有一些条目的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 :(

可能出现什么问题?

2 个答案:

答案 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)