2 回答
TA贡献1784条经验 获得超2个赞
根据变量的值获取值有效:
m := map[string]string{"hey": "found"}
fmt.Println(m["hey"]) // found
cmd := []string{"1", "2", "3", "hey"}
fmt.Println(m[cmd[3]]) // found
如果变量是string类型并且您对其值进行切片,它甚至可以工作,例如:
cmd = []string{"1", "2", "3", "Hhey"}
fmt.Println(m[cmd[3][1:]]) // found
你的问题很可能cmd[3]是它string "hey"本身,但是如果你像 那样切片cmd[3][1:],它会切断第一个字符(或者准确地说:它的 UTF-8 编码序列中的第一个字节,strings的内存表示,但是"hey"一对一映射到字节),所以它会是"ey",当然你不会在映射中找到任何关联的值:
cmd = []string{"1", "2", "3", "hey"}
fmt.Println(m[cmd[3][1:]]) // NOT FOUND (empty string - zero value)
在Go Playground上试试这些。
如果cmd[3]是"hey",则无需切片,只需将其用作键即可。
编辑:您声称cmd[3]包含string ":hey". 如果可以,它也可以工作:
cmd = []string{"1", "2", "3", ":hey"}
fmt.Println(m[cmd[3][1:]]) // found
所以你cmd[3]的不是你认为的那样。它可能包含0字节或不可打印的字符。打印其字节进行验证。例如字节string ":hey"是:[58 104 101 121]
fmt.Println([]byte(":hey")) // Prints [58 104 101 121]
打印您cmd[3]的验证:
fmt.Println([]byte(cmd[3]))
您也可以将其与strings您认为的比较,但这只会告诉您它们是否相等(而不会告诉您差异在哪里):
fmt.Println(cmd[3] == ":hey", cmd[3][1:] == "hey")
- 2 回答
- 0 关注
- 138 浏览
添加回答
举报