【问题标题】:Can I use defer to delete an element of a map?我可以使用 defer 删除地图的元素吗?
【发布时间】:2020-08-19 10:02:53
【问题描述】:
type Tasks map[int]CustomValue

func (t *Tasks) Put(task MyTask) {
    (*t)[len(*t)] = task
    return len(*t) - 1
}

func (t *Tasks) Get(taskID int) interface{} {
    defer func() {         // Is this OK???
        delete(*t, taskID)
    }()
    return (*t)[jobID].GetValue()
}

这是我的 Go 代码。基本上,我使用地图来存储一些“键值”。我有两个函数PutGet

得到值后,我想从地图中删除元素。

我可以简单地使用延迟机制来做到这一点吗?不知道return后是否必须调用defer函数。

【问题讨论】:

  • 如果你有多个 goroutines 使用这些函数,你需要一个互斥体来防止数据竞争。互斥锁解锁可以放在defer

标签: dictionary pointers go deferred


【解决方案1】:

是的,defer 可用于从地图中删除您打算使用的元素。

Spec: Defer statements:

...如果周围的函数通过显式的return statement 返回,则延迟函数将在之后执行任何结果参数由该返回语句设置,但在函数之前返回给它的调用者。

所以(*t)[jobID].GetValue() 将在延迟函数中的删除发生之前进行评估。

但是请注意,映射是底层的指针(有关详细信息,请参阅why slice values can sometimes go stale but never map values?),因此您应该使用非指针接收器。这也大大简化了您的代码,并提高了效率。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多