我想使用 URL 參數將密鑰從一個名稱更新為另一個名稱。我有代碼,但輸出不正確。見下文。這是地圖var data map[string][]string調用函數的 PUT 方法r.HandleFunc("/updatekey/{key}/{newkey}", handleUpdateKey).Methods("PUT")handleUpdateKey 函數,它被記錄下來,準確地解釋了它在做什么。func handleUpdateKey(w http.ResponseWriter, r *http.Request) {params := mux.Vars(r)k := params["key"] //get url paramsnk := params["newkey"]s := make([]string, len(data[k])) //create slice of string to store map variablesfor i := range data { //range over the data map fmt.Fprintf(w, i) if k != i { //check if no keys exist with URL key param fmt.Fprintf(w, "That KEY doesn't exist in memory") break //kill the loop } else { //if there is a key the same as the key param for _, values := range data[i] { //loop over the slice of string (values in that KEY) s = append(s, values) //append all those items to the slice of string } delete(data, k) //delete the old key for _, svalues := range s { //loop over the slice of string we created earlier data[nk] = append(data[nk], svalues) //append the items within the slice of string, to the new key... replicating the old key, with a new key name } }}}下面應該將該 KEY 的所有值分配給一段字符串,我們稍后會對其進行迭代并將其添加到新的 KEY 中。這有效,但是,輸出如下,這顯然是不正確的KEY: catt: VALUE: KEY: catt: VALUE: KEY: catt: VALUE: zeusKEY: catt: VALUE: xena舊輸出:KEY: dog: VALUE: zeusKEY: dog: VALUE: xena正確的新輸出:KEY: catt: VALUE: zeusKEY: catt: VALUE: xena
1 回答

瀟瀟雨雨
TA貢獻1833條經驗 獲得超4個贊
在大多數語言中,改變你正在迭代的結構會導致奇怪的事情發生。特別是地圖。你必須找到另一種方法。
幸運的是,根本不需要迭代。您的循環只是一個大的 if/else 語句。如果密鑰匹配,則執行某些操作。如果沒有,請執行其他操作。因為是map,所以不用迭代查找key,直接查找即可。也不需要為了復制地圖值而進行所有費力的循環。
if val, ok := data[k]; ok {
// Copy the value
data[nk] = val
// Delete the old key
delete(data, k)
} else {
fmt.Fprintf(w, "The key %v doesn't exist", k)
}
最后,避免在函數中使用全局變量。如果函數可以更改全局變量,則很難理解函數對程序的影響。data應該傳遞給函數以使其清楚。
func handleUpdateKey(w http.ResponseWriter, r *http.Request, data map[string][]string)
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報
0/150
提交
取消