🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 6.1 创建消息管理模块 ##### A\) 创建消息管理模块抽象类 在`zinx/ziface`下创建`imsghandler.go`文件。 ```go package ziface /* 消息管理抽象层 */ type IMsgHandle interface{ DoMsgHandler(request IRequest) //马上以非阻塞方式处理消息 AddRouter(msgId uint32, router IRouter) //为消息添加具体的处理逻辑 } ``` 这里面有两个方法,`AddRouter()`就是添加一个msgId和一个路由关系到Apis中,那么`DoMsgHandler()`则是调用Router中具体`Handle()`等方法的接口。 ##### B\) 实现消息管理模块 在`zinx/znet`下创建`msghandler.go`文件。 ```go package znet import ( "fmt" "strconv" "zinx/ziface" ) type MsgHandle struct{ Apis map[uint32] ziface.IRouter //存放每个MsgId 所对应的处理方法的map属性 } func NewMsgHandle() *MsgHandle { return &MsgHandle { Apis:make(map[uint32]ziface.IRouter), } } //马上以非阻塞方式处理消息 func (mh *MsgHandle) DoMsgHandler(request ziface.IRequest) { handler, ok := mh.Apis[request.GetMsgID()] if !ok { fmt.Println("api msgId = ", request.GetMsgID(), " is not FOUND!") return } //执行对应处理方法 handler.PreHandle(request) handler.Handle(request) handler.PostHandle(request) } //为消息添加具体的处理逻辑 func (mh *MsgHandle) AddRouter(msgId uint32, router ziface.IRouter) { //1 判断当前msg绑定的API处理方法是否已经存在 if _, ok := mh.Apis[msgId]; ok { panic("repeated api , msgId = " + strconv.Itoa(int(msgId))) } //2 添加msg与api的绑定关系 mh.Apis[msgId] = router fmt.Println("Add api msgId = ", msgId) } ```