确定删除操作是否实际上删除了映射中的现有键

时间:2018-10-24 02:32:49

标签: go

我有一个叫map的{​​{1}}

nearby

我想确定delete()调用是否确实找到了要删除的键,我尝试读取返回值:

func Delete(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    delete(nearby, params["id"])
}

但是编译器不喜欢这样-我如何确定是否删除了键/值?

2 个答案:

答案 0 :(得分:3)

在删除值之前探测地图:

func Delete(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    _, deleted := nearby[params["id"]]
    delete(nearby, params["id"])
    fmt.Println(deleted)
}

此代码段和问题中的代码之间存在数据争用,因为可以同时调用HTTP处理程序。添加互斥锁以保护地图。

var (
    nearby = make(map[string]string)
    mu     sync.Mutex
)

func Delete(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    mu.Lock()
    _, deleted := nearby[params["id"]]
    delete(nearby, params["id"])
    mu.Unlock()
    fmt.Println(deleted)
}

答案 1 :(得分:1)

Go内置delete()不会返回任何内容,因此您无法确定它是否删除了任何内容。

但是您可以 check if the map contains the keydelete()(如果存在)。

if _, ok := nearby[params["id"]]; ok {
    delete(nearby, params["id"])
} else {
    // whatever
}