for-loop - 更新地图中的键,同时迭代该地图
问题描述
我想使用 URL 参数将密钥从一个名称更新为另一个名称。我有代码,但输出不正确。见下文。
这是地图
var data map[string][]string
im 调用的函数的 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
解决方案
在大多数语言中,改变你正在迭代的结构会导致奇怪的事情发生。特别是地图。你必须找到另一种方式。
幸运的是,根本不需要迭代。您的循环只是一个大的 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)
推荐阅读
- python - 如何修复“TypeError:*:'NoneType'和'float'不支持的操作数类型”?
- snowflake-cloud-data-platform - 获取大型 json 文件的一级元素概览
- html - 图像在 Chrome 中加载,但在 Safari 中加载,除非页面被刷新或以手机或平板电脑屏幕尺寸查看
- vba - 添加 Outlook 库以访问 VBA 会阻止 SAP createsession 工作
- vuejs2 - 在Vue中,v-model.trim的目的是什么
- javascript - 使用 anguler ActivatedRouter 快照参数获取 json
- python - `kubectl rollout restart 的 Python 客户端 euqivelent
- coding-style - 以编程方式访问 Roslyn 中的代码分析结果
- c# - C# - float.parse 忽略点
- python - 线程功能块 main 并非一直如此