【发布时间】:2019-01-07 17:57:39
【问题描述】:
我想使用 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 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
}
}
}
}
下面应该将该 KEY 的所有值分配给一个字符串切片,我们稍后会对其进行迭代并添加到新的 KEY 中。这行得通,但是,输出如下,显然不正确
KEY: catt: VALUE:
KEY: catt: VALUE:
KEY: catt: VALUE: zeus
KEY: catt: VALUE: xena
旧输出:
KEY: dog: VALUE: zeus
KEY: dog: VALUE: xena
正确的新输出:
KEY: catt: VALUE: zeus
KEY: catt: VALUE: xena
【问题讨论】:
-
在迭代地图时不要改变它。您可以更改值,但不应添加或删除任何项目。
-
另外,如果您尝试修改地图中的 键,您应该重新考虑您的设计。正如您从必须删除并重新添加项目以伪造更改键所看到的那样,映射键是不可变的。也许您只想要一个项目,其中每个项目都有键字段?
-
你的意思是像一个结构吗? Key和Value存储在里面?
-
是的,就像一个结构体。