2016-01-16 24 views
2

中獲得價值的時候所以我有這樣的結構:預期的值從地圖

type Magni struct { 
    ... 
    Handlers map[string]func(*Message) 
    ... 
} 

而且我有一個函數來創建結構的新實例:

func New(nick, user, real string) *Magni { 
    return &Magni{ 
     ... 
     Handlers: make(map[string]func(*Message)), 
     ... 
    } 
} 

但我做不到當"hey"位於一個變量中時,從Handlers地圖中獲得"hey"密鑰的地圖,它只有在我自己輸入時才起作用。這裏是結構Magnim的方法的指針結構Magni

handler := m.Handlers[cmd[3][1:]] // cmd[3][1:] contains string "hey" 
handler2 := m.Handlers["hey"] 

出於某種原因,handlernilhandler2值是0x401310,基本上我沒想到handler到是nil

我做錯了什麼或者這是預期的行爲?

回答

0

修剪字符串解決問題。

strings.TrimSpace(cmd[3]) 
1

獲取基於變量的值,工程價值:

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編碼序列的第一個字節,m的string埃默裏表示,但"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") 
+0

實際上'cmd [3]'是字符串':hey'所以'cmd [3] [1:]'是'hey'。 –

+0

@StianOK然後你的'cmd [3]'不是'string'':嘿嘿''。請參閱編輯以驗證它。 – icza