为了账号安全,请及时绑定邮箱和手机立即绑定

从地图获取价值时的意外价值

从地图获取价值时的意外价值

Go
神不在的星期二 2021-12-07 10:42:36
所以我有一个这样的结构:type Magni struct {    ...    Handlers map[string]func(*Message)    ...}我有一个函数来创建结构的新实例:func New(nick, user, real string) *Magni {    return &Magni{        ...        Handlers: make(map[string]func(*Message)),        ...    }}但我不能得到的东西Handlers有图有钥匙"hey"时,"hey"在一个变量,它只有当我键入它自己的作品。这里是该结构的方法Magni和m是一个指向结构Magni:handler := m.Handlers[cmd[3][1:]] // cmd[3][1:] contains string "hey"handler2 := m.Handlers["hey"]出于某种原因,价值handler就是nil和价值handler2就是0x401310,基本上我不希望handler是nil。我做错了什么还是这是预期的行为?
查看完整描述

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")


查看完整回答
反对 回复 2021-12-07
?
GCT1015

TA贡献1827条经验 获得超4个赞

修剪字符串可以解决问题。

strings.TrimSpace(cmd[3])


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信