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

所以我有一个这样的结构:


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。


我做错了什么还是这是预期的行为?


神不在的星期二
浏览 139回答 2
2回答

一只斗牛犬

根据变量的值获取值有效:m := map[string]string{"hey": "found"}fmt.Println(m["hey"]) // foundcmd := []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")

GCT1015

修剪字符串可以解决问题。strings.TrimSpace(cmd[3])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go