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 關注
- 168 瀏覽
添加回答
舉報