使用一次查找从地图中弹出一个值

war*_*iuc 1 go

如何在 Go 中实现一个仅使用一次查找从地图中弹出键的函数?此版本在地图上进行两次查找:

package main

import "fmt"

func main() {
    m := map[string]int{"a":1, "b":2}
    a, ok := m["a"]
    if ok {
        delete(m, "a")
    }
    fmt.Println(a, m)
}
Run Code Online (Sandbox Code Playgroud)

我检查过可能delete会返回已删除键的值:

package main

func main() {
    m := map[string]int{"a":1, "b":2}
    println(delete(m, "a"))
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

prog.go:5: delete(m, "a") used as value
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 5

Go 没有Pop映射函数,因此总会有 2 个操作,一个索引和一个delete

如果您担心冗长性能,那么像这样的小辅助函数将被内联,因此使用它不会产生额外的运行时开销。

func pop(m map[string]int, key string) (int, bool) {
    v, ok := m[key]
    if ok {
        delete(m, key)
    }
    return v, ok
}
Run Code Online (Sandbox Code Playgroud)