亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從地圖獲取價值時的意外價值

從地圖獲取價值時的意外價值

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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號