package main
import (
"fmt"
"strings"
"runtime"
"time"
)
type ChangeMessage struct {
MessageId string
MessageType string
Value int
}
type HandleFunc struct{
filterFunc func(string) bool
handFunc func(ChangeMessage) error
}
type HandleMap struct{
HandFuncList []HandleFunc
}
func (h *HandleMap)register( f HandleFunc){
h.HandFuncList = append(h.HandFuncList, f)
}
func messageHandle(mChan chan ChangeMessage,hm HandleMap){
for {
select{
case event:=<-mChan:
fmt.Println("chan pop one element",event)
for _,v:=range hm.HandFuncList{
if v.filterFunc(event.MessageType){
err:=v.handFunc(event)
if err!=nil{
fmt.Println("error")
}
}
}
fmt.Println("finish mChan")
}
}
}
func filter1(MessageType string) bool {
return strings.Contains(MessageType, "a1")
}
func handle1(c ChangeMessage) error {
fmt.Println("finsh handle1 for message ",c)
return nil
}
func filter2(MessageType string) bool {
return strings.Contains(MessageType, "a2")
}
func handle2(c ChangeMessage) error {
fmt.Println("finsh handle2 for message ",c)
return nil
}
func filter3(MessageType string) bool {
return strings.Contains(MessageType, "a3")
}
func handle3(c ChangeMessage) error {
fmt.Println("finsh handle3 for message ",c)
return nil
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
hm:=HandleMap{}
hm.register(HandleFunc{filter1,handle1})
hm.register(HandleFunc{filter2,handle2})
fmt.Println(hm)
mChan := make(chan ChangeMessage )
go messageHandle(mChan,hm)
mChan<-ChangeMessage{"123","aa",2}
mChan<-ChangeMessage{"121","a1a2",3}
mChan<-ChangeMessage{"121","a1",3}
mChan<-ChangeMessage{"121","a2",3}
mChan<-ChangeMessage{"121","a3",3}
}
golang event meassage driver framework
最新推荐文章于 2024-09-26 07:27:43 发布