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.

50 lines
1.1 KiB

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