我认为你的问题可能与
ip
您捕获的变量
AfterFunc
func
.
timer = time.AfterFunc(time.Second*10, func() {
log.Println("time after func", ip)
delete(timers, ip)
db.Delete(ip)
})
从该代码中删除
知识产权
将使用的值调用
知识产权
变量
目前
这个计时器过期了。因此,如果同时您从另一个具有不同IP的设备接收到数据包,则此数据包将被删除。
正在发生的事情的示例:
-
第二个1
:IP为1.2.3.4的设备发送UDP数据包。
ip = 1.2.3.4
,
后函数
调用,10秒计时器启动
-
第二个3
:IP为4.5.6.7的设备发送UDP数据包。现在
ip = 4.5.6.7
,
后函数
调用,10秒计时器启动
-
第二个10
:删除当前值的函数
知识产权
变量被调用,设备
4.5.6.7
已删除
-
第二个13
:第二个计时器超时,我们尝试删除
4.5.6.7节
再一次
因此,IP设备
1.2.3.4
永远不会被删除。
可以通过创建一个函数来修复此问题,该函数接受一个参数并返回当前值为参数的func()。
timer = time.AfterFunc(time.Second*10, func(ip string) func() {
return func() {
log.Println("time after func", ip)
delete(timers, ip)
db.Delete(ip)
}
}(ip))
更简单的工作示例:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("Capturing value of i at the moment of execution of func()")
for i := 0; i < 5; i++ {
afterFuncTimer := time.AfterFunc(time.Second*2, func() {
fmt.Printf("AfterFunc() with %v\n", i)
})
defer afterFuncTimer.Stop()
}
time.Sleep(5 * time.Second)
fmt.Println("Capturing value of i from the loop")
for i := 0; i < 5; i++ {
afterFuncTimer := time.AfterFunc(time.Second*2, func(i int) func() {
return func() {
fmt.Printf("AfterFunc() with %v\n", i)
}
}(i))
defer afterFuncTimer.Stop()
}
time.Sleep(5 * time.Second)
}
在游乐场上跑步:
https://play.golang.org/p/bGWzTaWe3ZU