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 }