我想使用URL参数将密钥从一个名称更新为另一个。我有代码,但是输出不正确。见下文。
这是地图
include
函数im调用的PUT方法
prepend
handleUpdateKey函数,上面有确切的解释,说明了它在做什么。
completion
下面应该将那个KEY的所有值分配给一个字符串切片,我们稍后对其进行迭代并添加到新的KEY中。这行得通,但是输出如下所示,这显然是不正确的
var data map[string][]string
旧输出:
r.HandleFunc("/updatekey/{key}/{newkey}", handleUpdateKey).Methods("PUT")
正确的新输出:
func handleUpdateKey(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
k := params["key"] //get url params
nk := params["newkey"]
s := make([]string, len(data[k])) //create slice of string to store map variables
for 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
}
}
}
}
答案 0 :(得分:4)
在大多数语言中,更改要迭代的结构将导致发生奇怪的事情。特别是地图。您必须找到另一种方法。
幸运的是,根本不需要迭代。您的循环只是一个很大的if / else语句。如果密钥匹配,请执行某些操作。如果没有,请执行其他操作。由于这是一张地图,因此不需要使用迭代搜索键,可以直接对其进行查找。同样,也无需进行所有繁琐的循环操作即可复制地图值。
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)