php是最好的语言

golang注册函数demo 参考leaf框架

golang注册函数demo 参考leaf框架

package main

import (
   "fmt"
   "reflect"
   "time"
)

// 存注册函数map
var functions map[interface{}]interface{}

// 函数调用信息
type CallInfo struct {
   f       interface{}
   args    []interface{}

}

// 退出信号
var closeSig chan bool

// 函数消息队列
var ChanCall  chan *CallInfo



// 注册的消息
type Hello struct {
}
func HelloF()  {
   fmt.Println("HelloF")
}



// 注册的消息
type World struct {
}
func WorldF(args []interface{}) interface{} {
   // 这里要断言获取数据具体类型
   fmt.Println("WorldF")
   fmt.Println(args[0].(string))
   fmt.Println(args[1].(int))

   return args[0]
}


// 注册函数
func register(id interface{}, f interface{}) {

   switch f.(type) {
   case func():
   case func([]interface{}):
   case func([]interface{}) interface{}:
   case func([]interface{}) []interface{}:
   default:
      panic(fmt.Sprintf("function id %v: definition of function is invalid", id))
   }

   if _, ok := functions[id]; ok {
      panic(fmt.Sprintf("function id %v: already registered", id))
   }

   functions[id] = f
}

// 执行函数
func exec(f interface{},args []interface{})  {

   switch f.(type) {
   case func():
      f.(func())()
   case func([]interface{}):
      f.(func([]interface{}))(args)
   case func([]interface{}) interface{}:
      ret := f.(func([]interface{}) interface{})(args)
      fmt.Println(ret)
   case func([]interface{}) []interface{}:
      ret := f.(func([]interface{}) []interface{})(args)
      fmt.Println(ret)
   }
}

// 运行函数
func  Run() {
   for {
      select {
      case <-closeSig:
         return
      case ci := <- ChanCall:
         exec(ci.f,ci.args)
      }
   }
}


func handle(m interface{}, h interface{}) {
   register(reflect.TypeOf(m),h)
}

func execHandle(m interface{},args []interface{})  {

   f := functions[reflect.TypeOf(m)]
   // 放到执行队列
   ChanCall <- &CallInfo{
      f:    f,
      args: args,
   }

}


func main() {

   // 声明退出协程信号
   closeSig = make(chan bool)

   // 声明存执行函数和参数chan结构体
   ChanCall = make(chan *CallInfo,100)

   // 声明存储函数
   functions = make(map[interface{}]interface{})

   // 注册消息和消息对应的方法(一一对应)
   handle(&Hello{},HelloF)
   handle(&World{},WorldF)

   // 放到执行队列
   execHandle(&Hello{},[]interface{}{})
   execHandle(&World{},[]interface{}{"1",2})

   // 执行函数
   go Run()

   // 延时6s关闭协程
   time.Sleep(6 * time.Second)
   closeSig <- true
}


作者:xTao 分类:LNMP 浏览:2390 评论:0