You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.0 KiB

  1. /**
  2. * @Author: Aceld
  3. * @Date: 2019/4/30 11:57
  4. * @Mail: danbing.at@gmail.com
  5. */
  6. package ztimer
  7. import (
  8. "fmt"
  9. "reflect"
  10. "zinx/zlog"
  11. )
  12. /*
  13. 定义一个延迟调用函数
  14. 延迟调用函数就是 时间定时器超时的时候触发的事先注册好的
  15. 回调函数
  16. */
  17. type DelayFunc struct {
  18. f func(...interface{}) //f : 延迟函数调用原型
  19. args []interface{} //args: 延迟调用函数传递的形参
  20. }
  21. /*
  22. 创建一个延迟调用函数
  23. */
  24. func NewDelayFunc(f func(v ...interface{}), args []interface{}) *DelayFunc {
  25. return &DelayFunc{
  26. f:f,
  27. args:args,
  28. }
  29. }
  30. //打印当前延迟函数的信息,用于日志记录
  31. func (df *DelayFunc) String() string {
  32. return fmt.Sprintf("{DelayFun:%s, args:%v}", reflect.TypeOf(df.f).Name(), df.args)
  33. }
  34. /*
  35. 执行延迟函数---如果执行失败抛出异常
  36. */
  37. func (df *DelayFunc) Call() {
  38. defer func() {
  39. if err := recover(); err != nil {
  40. zlog.Error(df.String(), "Call err: ", err)
  41. }
  42. }()
  43. //调用定时器超时函数
  44. df.f(df.args...)
  45. }