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
}