为了账号安全,请及时绑定邮箱和手机立即绑定

更新地图中的键,同时遍历该地图

更新地图中的键,同时遍历该地图

Go
神不在的星期二 2023-06-01 10:02:35
我想使用 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)


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信