【问题标题】:Pop a value from a map using one lookup使用一次查找从地图中弹出一个值
【发布时间】:2014-07-01 02:14:02
【问题描述】:

如何在 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)
}

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

package main

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

但这不起作用:

prog.go:5: delete(m, "a") used as value

【问题讨论】:

  • “Pop”是典型的栈/堆操作。地图是无序的;集,如果你愿意的话。请改用container/heap
  • @tomwilde 我的意思是popPython dicts一样

标签: go


【解决方案1】:

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
}

【讨论】:

  • 你有“将被内联”的参考吗?我有兴趣了解 Go 编译器如何找到内联候选对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
相关资源
最近更新 更多