我可以使用 defer 来删除地图的元素吗?
Can I use defer to delete an element of a map?
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 代码。基本上,我使用地图来存储一些“键值”。我有两个函数 Put
和 Get
.
取值后,想从map中删除元素
我可以简单地使用延迟机制来这样做吗?不知道在return.
之后是否一定要调用defer函数
是的,defer
可用于从地图中删除您打算使用的元素。
...if the surrounding function returns through an explicit return statement, deferred functions are executed after any result parameters are set by that return statement but before the function returns to its caller.
因此 (*t)[jobID].GetValue()
将在延迟函数中的删除发生之前进行评估。
但是请注意,映射是引擎盖下的指针(有关详细信息,请参见 ),因此您应该使用 non-pointer 接收器。这也大大简化了您的代码,并使其更有效率。
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 代码。基本上,我使用地图来存储一些“键值”。我有两个函数 Put
和 Get
.
取值后,想从map中删除元素
我可以简单地使用延迟机制来这样做吗?不知道在return.
之后是否一定要调用defer函数是的,defer
可用于从地图中删除您打算使用的元素。
...if the surrounding function returns through an explicit return statement, deferred functions are executed after any result parameters are set by that return statement but before the function returns to its caller.
因此 (*t)[jobID].GetValue()
将在延迟函数中的删除发生之前进行评估。
但是请注意,映射是引擎盖下的指针(有关详细信息,请参见